Heredoc to łańcuch wielowierszowy. Zacznij go od <<<EOT, napisz tekst w kolejnych liniach i zakończ EOT; w osobnej linii. Zmienne w środku są podstawiane jak w łańcuchu w podwójnych cudzysłowach.
Identyfikator (tutaj EOT) to litera lub podkreślnik, po których następują litery, cyfry lub podkreślniki. Zwykle wybiera się nazwy, które mówią, czym jest tekst: HTML, SQL, TEXT. Niektóre edytory, w tym PhpStorm, podświetlają treść jako ten język, gdy nazwa to HTML albo SQL.
Szablon HTML w heredoc
Heredoc to najczytelniejszy sposób zapisu bloku HTML z wartościami, bo znaczniki zachowują swój kształt i nic nie trzeba escapować. Wynik to HTML, więc edytor pokazuje go na karcie Page.
Dwa szczegóły w tym bloku: element tablicy jest objęty nawiasami klamrowymi, {$product['name']}, a dosłowny znak dolara przed ceną jest escapowany jako \$. Zmień nazwę albo dodaj znacznik i uruchom ponownie.
Wartości od użytkowników trzeba escapować, zanim trafią do HTML. Dlaczego i jak, wyjaśnia strona o htmlspecialchars.
Nowdoc: tekst bez interpolacji
Nowdoc ma identyfikator w pojedynczych cudzysłowach: <<<'EOT'. Nic w środku nie jest podstawiane, więc znaki dolara i ukośniki wsteczne zostają takie, jak je zapisano. Używaj go do przykładów kodu, wyrażeń regularnych i każdego tekstu, który zawiera $.
Wcięcie znacznika zamykającego
Od PHP 7.3 znacznik zamykający może być wcięty, a to wcięcie jest usuwane z każdej linii treści. Dzięki temu heredoc w funkcji albo w if może podążać za wcięciem kodu, a spacje nie trafiają do łańcucha.
Linia z json_encode pokazuje wynik znak po znaku: z każdej linii usunięto 8 spacji, bo zamykające TEXT; jest wcięte o 8.
Linia treści wcięta mniej niż znacznik zamykający to błąd parsowania:
$html = <<<HTML
<p>Hello</p>
HTML;
PHP Parse error: Invalid body indentation level (expecting an indentation level of at least 4) in /home/index.php on line 3
Tablice, obiekty i wywołania metod w heredoc
Heredoc działa według tych samych zasad co podwójne cudzysłowy. Proste zmienne działają same; dla kluczy tablic w cudzysłowach, zagnieżdżonych tablic, właściwości i wywołań metod użyj nawiasów klamrowych.
Heredoc jako argument funkcji
Od PHP 7.3 po znaczniku zamykającym może w tej samej linii stać dalszy kod, więc heredoc można przekazać prosto do funkcji albo umieścić w tablicy. Z sprintf dostajesz szablon, którego symbole zastępcze wypełnisz później.
Częsty błąd: brak średnika albo dodatkowy tekst po znaczniku
Identyfikator zamykający musi być zapisany dokładnie tak jak przy otwarciu (ta sama wielkość liter), a to, co stoi po nim w tej linii, musi mieć sens jako PHP. EOT; kończy instrukcję, EOT, kontynuuje listę argumentów. Litera lub cyfra zaraz po znaczniku (EOTX;) go ukrywa, więc łańcuch biegnie do końca pliku, a PHP zgłasza syntax error, unexpected end of file. Odwrotna pułapka to linia treści, która zaczyna się od identyfikatora, po którym jest spacja lub znak interpunkcyjny, na przykład EOT is the marker: kończy łańcuch za wcześnie, a reszta tej linii jest czytana jako PHP (syntax error, unexpected identifier "is"). Wybierz identyfikator, który nigdy nie pojawia się na początku linii w tekście, na przykład HTML dla znaczników albo SQL dla zapytania.
Najczęściej zadawane pytania
Co to jest heredoc w PHP?
Sposób zapisu łańcucha wielowierszowego bez cudzysłowów: zacznij od <<<EOT i nowej linii, napisz tekst i zakończ EOT; w osobnej linii. Zmienne w środku są podstawiane dokładnie jak w łańcuchu w podwójnych cudzysłowach, a " i ' możesz używać swobodnie.
Czym różni się heredoc od nowdoc?
Heredoc (<<<EOT) podstawia zmienne i sekwencje ucieczki jak łańcuch w podwójnych cudzysłowach. Nowdoc (<<<'EOT', identyfikator w pojedynczych cudzysłowach) nie robi żadnej z tych rzeczy i zachowuje każdy $ i ukośnik wsteczny tak, jak są zapisane, jak łańcuch w pojedynczych cudzysłowach.
Czy znacznik zamykający heredoc może być wcięty?
Tak, od PHP 7.3. Wcięcie znacznika zamykającego jest usuwane z każdej linii treści, więc heredoc można wciąć zgodnie z kodem. Każda linia treści musi być wcięta co najmniej tak samo jak znacznik zamykający, inaczej PHP zatrzyma się z błędem parsowania.
Jak wywołać funkcję wewnątrz heredoc?
Heredoc interpoluje tylko zmienne, elementy tablic, właściwości i wywołania metod. Wywołaj funkcję wcześniej i zapisz wynik albo trzymaj nazwę funkcji lub domknięcie w zmiennej i wywołaj ją w nawiasach klamrowych: $e = 'htmlspecialchars';, a potem {$e($text)}.