Синтаксис PHP heredoc

Мне было интересно:

$foo = <<< EOT
Hello, World!
EOT;

так же действителен, как

$foo = <<<EOT
Hello, World!
EOT;

и, в частности, верно ли это во всех версиях PHP (или только в последних).

Мне интересно, потому что я хочу знать, является ли пробел между <<< и первым идентификатором EOT синтаксически допустимым. Например, мой интерпретатор PHP 5.3.10 выполняет это правильно, но мой текстовый редактор vim не выделяет синтаксис heredoc таким же образом, если между <<< и EOT есть пробел (идентификатор EOT окрашен в белый цвет, а не в фиолетовый).

Так в чем тут дело? Оба законны во всех версиях PHP или нет?


person John Goche    schedule 13.07.2012    source источник
comment
Я бы всегда доверял компилятору/интерпретатору, прежде чем доверять анализатору синтаксиса. Если это работает, то работает.   -  person Mihai Stancu    schedule 13.07.2012
comment
если это работает, единственное, что он знает, это то, что оно работает с этой версией.   -  person Karoly Horvath    schedule 13.07.2012
comment
Независимо от того, работает ли он с одной версией или со всеми версиями, вы не можете полагаться на его работу в будущем, если PHP специально не разрешает это. РЕДАКТИРОВАТЬ - что, по-видимому, и происходит... согласно ответам ниже.   -  person Pete    schedule 13.07.2012
comment
Добро пожаловать в Stack Overflow! Пожалуйста, научитесь принимать ответы... если вы не понимаете, о чем я говорю, нажмите здесь   -  person Manse    schedule 13.07.2012


Ответы (3)


Нет, вы не должны ставить пробел между ‹‹‹ и идентификатором. Как указано в документации PHP:

(...) идентификатор должен соответствовать тем же правилам именования, что и любая другая метка в PHP: он должен содержать только буквенно-цифровые символы и символы подчеркивания и должен начинаться с нецифрового символа или символа подчеркивания .

Источник: http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

person Destralak    schedule 13.07.2012
comment
Пробел недопустим, потому что идентификатор должен стоять сразу после ›››; цитата: After this operator, an identifier is provided, then a newline - person Destralak; 13.07.2012
comment
Именно так это выглядит для синтаксического анализатора, даже если между ними есть сотня пробелов. - person Jon; 13.07.2012

Допускаются табуляции и пробелы, а также кавычки:

<ST_IN_SCRIPTING>b?"<<<"{TABS_AND_SPACES}({LABEL}|([']{LABEL}['])|(["]{LABEL}["])){NEWLINE} {

Источник

Редактировать:

  • вкладки и пробелы разрешены как минимум из 2001
  • добавлены кавычки в 2008
person Sjoerd    schedule 13.07.2012
comment
Несмотря на то, что сейчас код выглядит так, в руководстве указано, что вы должны использовать только буквенно-цифровые символы и символы подчеркивания, поэтому этот код может измениться в будущих версиях PHP. - person Destralak; 13.07.2012

В мануале написано (выделено мной), что

Третий способ разделения строк — это синтаксис heredoc: ‹‹‹. После этого оператора указывается идентификатор, а затем новая строка.

Для меня это означает, что пробел является необязательным (и всегда будет необязательным), поскольку в языке в целом идентификаторы могут быть отделены от соседних токенов любым количеством пробелов, включая отсутствие пробелов.

person Jon    schedule 13.07.2012