См. Следующий фрагмент, который ищет открывающий тег <?php
.Обратите внимание на требование завершающего пробела, горизонтальной табуляции или новой строки.
<INITIAL>"<?php"([ \t]|{NEWLINE}) {
<snip>
return T_OPEN_TAG;
}
(Источник: zend_language_scanner.l из PHP 5.3.10 )
Это означает, что PHP не видит ваш код как обычный (длинный) открытый тег, а скорее имеет короткий открытый тег.
<INITIAL>"<?" {
if (CG(short_tags)) {
<snip>
return T_OPEN_TAG;
} else {
goto inline_char_handler;
}
}
(Источник: zend_language_scanner.l из PHP 5.3.10
Короткий тег не требует конечных пробелов.
Итак, различные части вашего кода, которые видит PHP, <?
, php
, //comment
, error_reporting
…. php
принимается за константу (которая не существует, см. Ниже). Затем есть комментарий, что хорошо. Однако следующий шагдля вызова функции error_reporting()
. Это не то, что разрешено в данный момент, и теперь PHP выручает, жалуясь, что идентификатор (T_STRING
) error_reporting
не ожидался.
Чтобы продемонстрировать это, давайте попробуем некоторый код, который работает (что означает: код PHP выполнен успешно) с short_open_tag
включен, но не будет с short_open_tag
отключен.
<?php//comment
;
С error_reporting
достаточно высоким, чтобы показывать уведомления, вы сможете увидеть, что идет не так, как вывод, что-то вроде:
Примечание: использование неопределенной константы php - предполагается, что 'php' в example.php в строке 2
При выключенном short_open_tag
на выходе будет код вобычный текст, поскольку PHP не пытается его выполнить.
Наконец, небольшое напоминание об описании T_STRING
в списке токенов синтаксического анализатора , в котором говорится, что T_STRING
предназначено для (не спрашивайте меня, почему это не T_IDENTIFIER
, T_BAREWORD
или что-то менее запутанное):
идентификаторы, например, строки, объектно-ориентированные ключевые слова, такие как parent и self, функции, классы и многое другое.