PHP Heredoc Строковые правила - PullRequest
5 голосов
/ 28 сентября 2011

Может ли кто-нибудь здесь исследовать тонкости использования heredoc в PHP, используя примеры фрагментов кода php? Исходя из того, что написано в руководстве ниже?

Руководство php.net говорит:

Очень важно отметить, что строка с закрывающим идентификатором не должна содержать других символов, кроме, возможно, точки с запятой (;). В частности, это означает, что идентификатор не может иметь отступ, и не должно быть пробелов или табуляции до или после точки с запятой. Также важно понимать, что первый символ перед закрывающим идентификатором должен быть символом новой строки, как это определено локальной операционной системой. Это \n в системах UNIX, включая Mac OS X. После закрывающего разделителя (возможно, после точки с запятой) также должен стоять символ новой строки.

Если это правило нарушено и закрывающий идентификатор не является «чистым», он не будет считаться закрывающим идентификатором, и PHP продолжит его поиск. Если надлежащий закрывающий идентификатор не найден до конца текущего файла, в последней строке возникнет ошибка синтаксического анализа.

Heredocs нельзя использовать для инициализации свойств класса. Начиная с PHP 5.3, это ограничение действительно только для heredoc, содержащих переменные.

Вот ссылка на руководство по php: http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

Ответы [ 3 ]

8 голосов
/ 28 сентября 2011

это простое использование:

$bar = "stackoverflowpro";
$foo = <<<HTML
<p>Hello $bar</p>
HTML;
7 голосов
/ 28 сентября 2011
echo <<< _html

... some html code here ...

_html;

Важно то, что закрывающий тег точно такой же, как определено после «<<<», и что закрывающий тег помещается без отступа (без вкладок, полностью липкий слева) и закрывается знаком «»; ". </p>

Примечание:" _ "не требуется, но я использую его, чтобы лучше указать, что это закрытый heredoc.

5 голосов
/ 19 сентября 2014

Закрывающий идентификатор heredoc НЕ ДОЛЖЕН иметь вообще никаких символов между началом строки и идентификатором, он МОЖЕТ иметь один ; НЕМЕДЛЕННО после этого и НЕ ДОЛЖЕН иметь никаких других символов после него. Если идентификатор получает отступ, он должен рассматриваться как часть строки heredoc. Единственный символ, который может появиться перед новой строкой - ;. Вы даже не можете вставить пробел между идентификатором и ; или между ; и новой строкой. Это означает, что если вы используете heredoc внутри вызова функции, вы должны вставить разрыв строки сразу после закрывающего идентификатора (т.е. перед любым , или ) и т. Д.).

Другими словами, единственное, что может появиться в строке с закрывающим идентификатором, это сам идентификатор и, необязательно, одна точка с запятой (;) сразу после идентификатора. Следующий символ (если не в конце файла) ДОЛЖЕН быть действительным символом новой строки для операционной системы, на которой работает PHP.

Это допустимая строка heredoc:

$text = <<<EOT
Hello!
EOT;

Эта строка heredoc не была закрыта, и EOT; считается частью строки:

  $text = <<<EOT
  Hello!
  EOT;

Предыдущий пример исправлен:

  $text = <<<EOT
  Hello!
EOT;

Heredoc внутри вызова функции (обратите внимание, что ); должен появиться в новой строке для работы):

print(<<<EOT
Hello!
EOT
);

То же, что и выше, с очень странным отступом (обратите внимание, что единственная вещь в закрывающей строке идентификатора - это идентификатор и новая строка). Hello! будет иметь пять пробелов перед строкой:

           print(<<<EOT
     Hello!
EOT
                     );
...