Uwaga: przepraszam, jeśli jest to niezwykle proste pytanie, ale mam pewną obsesję kompulsywną w kwestii formatowania mojego kodu.
Mam klasę, która ma funkcję, która zwraca ciąg znaków, który będzie stanowić treść wiadomości e-mail. Chcę, aby ten tekst był sformatowany, aby wyglądał dobrze w e-mailu, ale także, aby mój kod nie wyglądał dziwnie. Oto o co mi chodzi:
class Something
{
public function getEmailText($vars)
{
$text = 'Hello ' . $vars->name . ",
The second line starts two lines below.
I also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
return $text;
}
}
ale można go również zapisać jako:
public function getEmailText($vars)
{
$text = "Hello {$vars->name},\n\rThe second line starts two lines below.\n\rI also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
return $text;
}
ale o co chodzi z nowymi liniami i powrotami karetki? Co za różnica? Czy \n\n
jest odpowiednikiem \r\r
lub \n\r
? Którego należy użyć, gdy tworzę przerwę między wierszami?
Następnie jest opcja buforowania wyjścia i składni heredoc.
Jak sobie radzisz z używaniem długich wielowierszowych ciągów w swoich obiektach?
Odpowiedzi:
Powinieneś użyć HEREDOC lub NOWDOC.
Różnica między Heredoc i Nowdoc polega na tym, że kod PHP osadzony w heredoc jest wykonywany, podczas gdy kod PHP w Nowdoc zostanie wydrukowany bez zmian.
W tym przypadku $ text będzie miał wartość
My $var
.Uwaga: przed zamknięciem
EOT;
nie powinno być spacji ani tabulatorów. w przeciwnym razie pojawi się błądźródło
EOT;
bez spacji przed nim.EOT;
nie powinno być spacji ani tabulatorów. w przeciwnym razie pojawi się błąd.Używam podobnego systemu co pix0r i myślę, że dzięki temu kod jest całkiem czytelny. Czasami posunąłbym się nawet do oddzielenia podziałów wierszy w podwójnych cudzysłowach i użycia pojedynczych cudzysłowów dla pozostałej części ciągu. W ten sposób wyróżniają się od reszty tekstu, a zmienne również wyróżniają się lepiej, jeśli używasz konkatenacji, zamiast wstawiać je w łańcuch w podwójnym cudzysłowie. Mogę więc zrobić coś takiego na Twoim oryginalnym przykładzie:
Jeśli chodzi o podziały wierszy, w przypadku e-maili należy zawsze używać \ r \ n. PHP_EOL jest przeznaczone dla plików, które mają być używane w tym samym systemie operacyjnym, w którym działa php.
źródło
Używam szablonów do długiego tekstu:
email-template.txt zawiera
W PHP robię to:
źródło
Dodawanie
\n
i / lub\r
w środku łańcucha i posiadanie bardzo długiej linii kodu, jak w drugim przykładzie, nie wydaje się właściwe: kiedy czytasz kod, nie widzisz wyniku i musisz przewijać .W tego rodzaju sytuacjach zawsze używam Heredoc (lub Nowdoc, jeśli używam PHP> = 5.3) : łatwe do napisania, łatwe do odczytania, nie ma potrzeby stosowania bardzo długich wierszy, ...
Na przykład :
Tylko jedno: znacznik końcowy (i „
;
” po nim) musi być jedyną rzeczą w tym wierszu: bez spacji / tabulacji przed ani po!źródło
Jasne, możesz użyć HEREDOC, ale jeśli chodzi o czytelność kodu, nie jest to tak naprawdę lepsze niż pierwszy przykład, zawijając ciąg w wiele linii.
Jeśli naprawdę chcesz, aby Twój wieloliniowy ciąg wyglądał dobrze i dobrze płynął z Twoim kodem, polecam łączenie ciągów w taki sposób:
Może to być nieco wolniejsze niż HEREDOC lub ciąg wieloliniowy, ale będzie dobrze płynąć z wcięciem twojego kodu i ułatwi czytanie.
źródło
Trochę bardziej podoba mi się ta metoda w Javascript, ale wydaje się, że warto ją tutaj uwzględnić, ponieważ nie została jeszcze wspomniana.
W przypadku mniejszych rzeczy często łatwiej jest pracować ze strukturami tablicowymi w porównaniu z połączonymi ciągami.
Powiązane: implode vs concat performance
źródło
Ten, który w to wierzy
czy ciąg wielowierszowy jest nieprawidłowy. To dwa łańcuchy z operatorem konkatenacji, a nie ciąg wielowierszowy. Takich połączonych ciągów nie można na przykład używać jako kluczy predefiniowanych tablic. Niestety php nie oferuje prawdziwych ciągów wielowierszowych w postaci
tylko
HEREDOC
iNOWDOC
składnię, która jest bardziej odpowiednia dla szablonów, ponieważ zagnieżdżone wcięcie kodu jest łamane przez taką składnię.źródło
możesz także użyć:
źródło
Jeśli chodzi o pytanie dotyczące nowych linii i zwrotów karetek:
Zalecałbym użycie predefiniowanej globalnej stałej PHP_EOL, ponieważ rozwiąże ona wszelkie problemy ze zgodnością między platformami.
To pytanie zostało zadane wcześniej w SO i możesz uzyskać więcej informacji, czytając „ Kiedy używam stałej PHP PHP_EOL ”
źródło
Nikt tutaj chyba nie odpowiedział na to pytanie, więc oto jestem.
\r
reprezentuje „powrót karetki”\n
reprezentuje „wysuw o wiersz”Rzeczywista przyczyna ich powstania sięga maszyn do pisania. W miarę wpisywania tekstu „karetka” przesuwał się powoli, znak po znaku, na prawo od maszyny do pisania. Gdy dojdziesz do końca linii, wrócisz karetką, a następnie udasz się do nowej linii . Aby przejść do nowego wiersza, należy przesunąć dźwignię, która podawała wiersze pisarzowi. W związku z tym te działania, łącznie, nazwano wysuwem wiersza powrotu karetki . A więc dosłownie:
Kanał linia,
\n
oznacza przejście do następnej linii.Powrót karetki
\r
oznacza przesunięcie kursora na początek wiersza.Ostatecznie
Hello\n\nWorld
na ekranie powinien pojawić się następujący wynik:Gdzie
Hello\r\rWorld
powinno skutkować następującym wyjściem .Dopiero łącząc te 2 znaki
\r\n
, masz wspólne rozumienie znanej linii. IEHello\r\nWorld
powinno skutkować:I oczywiście
\n\r
dałoby taki sam efekt wizualny jak\r\n
.Pierwotnie komputery brały
\r
i\n
dosłownie. Jednak w dzisiejszych czasach poparcie dla powrotu karetki jest niewielkie. Zwykle w każdym systemie możesz uciec z\n
samodzielnym używaniem . To nigdy nie zależy od systemu operacyjnego, ale zależy od tego, w czym przeglądasz dane wyjściowe.Mimo to zawsze radziłbym używać,
\r\n
gdzie tylko możesz!źródło