如何在PHP开始标记旁边添加注释会导致"意外的T_STRING"?

Lig*_*ica 1 php grammar

以下代码:

<?php//comment
error_reporting(0);
Run Code Online (Sandbox Code Playgroud)

结果(至少在5.2.11中):

解析错误:语法错误,意外T_STRING

......我觉得很奇怪.

是否<?php//comment应该逐字允许,我建议对于解析错误内容的无效性毫无疑问.

那是因为没有T_STRING看见(虽然我确实知道制作可能形成其他制作以灌输优先权,例如additive-expressions封装乘法运算等).

任何了解PHP语法的人都可以解释这是如何产生的吗?

sal*_*the 7

请参阅以下代码段以查找<?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或东西少混乱):

标识符,例如字符串,面向对象的关键字,如父和自我,函数,类等,是匹配的.