以下代码:
<?php//comment
error_reporting(0);
Run Code Online (Sandbox Code Playgroud)
结果(至少在5.2.11中):
解析错误:语法错误,意外T_STRING
......我觉得很奇怪.
是否<?php//comment应该逐字允许,我建议对于解析错误内容的无效性毫无疑问.
那是因为没有T_STRING看见(虽然我确实知道制作可能形成其他制作以灌输优先权,例如additive-expressions封装乘法运算等).
任何了解PHP语法的人都可以解释这是如何产生的吗?
请参阅以下代码段以查找<?php开始标记.请注意尾随空格,水平制表符或新行的要求.
<INITIAL>"<?php"([ \t]|{NEWLINE}) {
<snip>
return T_OPEN_TAG;
}
Run Code Online (Sandbox Code Playgroud)
(来源:PHP 5.3.10中的zend_language_scanner.l)
这意味着PHP不会将您的代码视为普通(长)开放标记,而是具有短开放标记.
<INITIAL>"<?" {
if (CG(short_tags)) {
<snip>
return T_OPEN_TAG;
} else {
goto inline_char_handler;
}
}
Run Code Online (Sandbox Code Playgroud)
(来源:PHP 5.3.10中的zend_language_scanner.l
短标记不需要尾随空格.
所以,你的代码PHP看到的是不同地区<?,php,//comment,error_reporting....它php被认为是一个常数(不存在,见下文).然后有一个评论,这很好.但是,下一步是调用该error_reporting()函数.这不是允许在这一点上发生的事情,现在是PHP退出,抱怨标签(T_STRING)error_reporting不是预期的.
为了证明这一点,让我们尝试一些能够正常运行的代码(意思是:PHP代码已成功执行)并short_open_tag启用,但不会short_open_tag禁用.
<?php//comment
;
Run Code Online (Sandbox Code Playgroud)
随着error_reporting高到足以显示通知,你就可以看到什么不顺心的输出是一样的东西:
注意:使用未定义的常量php - 在第2行的example.php中假定为'php'
随着short_open_tag关闭,输出将是纯文本的代码,因为PHP不会尝试执行它.
最后,有关说明的一点提醒T_STRING在解析器代号列表它说,T_STRING是(不要问我为什么它不是T_IDENTIFIER,T_BAREWORD或东西少混乱):
标识符,例如字符串,面向对象的关键字,如父和自我,函数,类等,是匹配的.