Какие правила применяются к закрытию строк heredoc?

#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 Идеальный ответ! Спасибо!