我有非常简单的测试用例,有关闭标记,故意使用额外的a
:
<?php echo 'test'; a?>
并且,没有结束标记,没有故意结束标记:
<?php echo 'test'; a
display_errors = On
时:
使用结束标记=&gt;测试注意:使用未定义的常量a - 在第3行的test.php中假定为'a'
没有结束标签=&gt;解析错误:语法错误,第3行test.php中的意外$ end
display_errors = Off
时:
使用结束标记=&gt;测试
没有结束标签=&gt; HTTP 500
为什么我收到HTTP 500错误?为什么输出(错误消息除外)是依赖display_errors选项?我认为它只能确定是否会打印错误。这是一个错误吗?
答案 0 :(得分:0)
如果没有你的结束标记,php解释器将无法确定脚本的结束位置(从而以解析器错误结束)。
但是关闭它,它会将'a'解析为常量。但是没有常量'a',因此它会将其视为String,并且解析器将返回此字符串值。由于没有变量接收它,它只会被扔掉。 (解析器可能会删除此a,因为它不会影响应用程序)。
答案 1 :(得分:0)
原因如下:
当PHP看到结束?>
标记时,它会添加一个隐式分号。这允许这样的语法:
<?php echo "something" ?>
为什么这很重要?
因为这意味着当您拥有结束标记时,您的迷路a
实际上被视为a;
。
这种差异足以让PHP解析它。它没有识别它,所以它猜测它是一个未知的常数,你得到你看到的通知信息。
如果没有结束标记,并且没有分号,PHP会看到未终止的代码行。这是语法错误; PHP根本无法解析它,所以它放弃了。
希望能解释其中的差异。
(侧面说明,整个未知 - 常数 - 所以 - 我假设一个字符串是PHP最严重的错误之一。由于历史原因它在那里,但我真的希望他们在将来的某个时候弃用它;它会让代码对由于一个小错字导致的可怕错误敞开大门)
答案 2 :(得分:0)
这是PHP的解析器和语法的粗俗。
PHP允许您在T_CLOSE_TAG之前省略分号,因此当PHP解析器看到它时:
a?>
它假设你的意思是:
a; ?>
然后它会将undefined constant a
强制转换为字符串并发出E_NOTICE
。 (这是PHP的一个可怕的错误。)所以这实际上相当于:
'a'; ?>
由于这不是致命错误且该表达式没有副作用,因此程序正常执行。
但是,如果省略close标记,则会出现语法错误,因为没有任何信号表示表达式的结尾。语法错误是致命的,因此500 Internal Server Error
是响应。
display_errors
设置仅影响是否将错误打印到响应中(即,您是否看到notice
和parse error
消息。)
答案 3 :(得分:0)
我有不同的结果。作为OP的代码说,W / o结束标记,对我来说不会导致500错误。
<?php
error_reporting(0);
ini_set('display_errors', 0);
echo 'test'; a
相反,我得到:
Parse error: syntax error, unexpected $end in /my-path/test/index.php on line 4