#php
#php
Вопрос:
Я всегда думал, что строки heredoc должны заканчиваться очень чистой строкой, например EOD;
… в этой строке больше ничего не должно быть — ни отступов, ни пробелов до или после и т.д…
В документации PHP heredoc говорится то же самое: «Очень важно отметить, что строка с закрывающим идентификатором не должна содержать никаких других символов, кроме точки с запятой (;). В частности, это означает, что идентификатор может не иметь отступов, и перед точкой с запятой или после нее не может быть пробелов или табуляции »
Но, похоже, это совсем не так важно. Взгляните на приведенные ниже примеры. Последний heredoc-текст генерирует синтаксическую ошибку (но не при закрытии EOD;
). Первые два примера работают нормально.
Мой вопрос: разрешено ли делать отступ для закрывающего идентификатора heredoc, как во втором примере? Это делает код лучше, ИМХО. Или существуют ситуации, когда идентификатор закрытия с отступом приведет к неожиданному поведению?
<?php
function talk_to_me() {
// Example 1: The closing EOD; is "clean" - no indentation and nothing after... just like it should. Right?
$text = <<<EOD
Hello World
EOD;
echo "<div> $text </div>";
// Example 2: The closing EOD; is indented. It shouldn't be allowed, but it works fine (?)
$text = <<<EOD
How are you?
EOD;
echo "<div> $text </div>";
// Example 3: The 'Bye bye' text is not indented... THAT line generates an error, but not the indented EOD;
// Syntax error says: "Invalid body indentation level (expecting an indentation level of at least 8)"
$text = <<<EOD
Bye bye!
EOD;
echo "<div> $text </div>";
}
talk_to_me();
/*
If the "Bye bye" is indented correctly this will output:
Hello World
How are you?
Bye bye!
*/
?>
Комментарии:
1. Для php 7.3 — php.net/manual/en/migration73.new-features.php
2. Отличная работа по обновлению документации…
3. @NigelRen Идеальный ответ! Спасибо!