为什么PHP没有报告此错误?

时间:2013-11-12 08:39:11

标签: php error-reporting

服务器正在运行PHP5.3。我通过在页面运行之前注释掉代码来发现问题。当我第一次加载页面时,我没有输出没有错误。

我将错误报告设置为:

error_reporting(E_ALL^E_NOTICE);
ini_set('display_errors', 1);

注意:需要禁用通知,因为系统已经很旧并且最初编写得很糟糕(我们现在正在逐步解决这些问题)

阻止脚本正常运行的行就是这一行。

<?php echo explode('cms/', pageURL())[0]?>

这在PHP5.4中运行良好。 5.3不支持这个但是为什么不显示错误呢?这究竟是什么使调试变得如此困难?对于各种问题,这已经发生过一次或两次,最好能够更好地理解潜在的问题。

是否可以通过此问题在5.3上显示错误?

错误报告正在服务器上运行。

poop();

返回

Fatal error: Call to undefined function poop()

编辑:更新代码时编辑失败并且有一行包含:

$parts = echo explode('cms/',pageURL());

这导致了同样的问题。没有输出,没有错误。脚本失败了。

5 个答案:

答案 0 :(得分:4)

背景信息:

如果正在通过函数调用(而不是设置文件)设置error_reporting设置,则会在加载的第一个文件中出现语法错误(例如:index.php )PHP解释器无法输出错误。

如果你有一个非常简单的index.php文件,其中包含有致命语法错误的文件,那么PHP解释器将能够输出错误。

这是PHP解释器的“已知限制”,因为大多数解释器需要首先读取两遍中的文件来获取令牌,然后才能正确评估令牌表示语言的语法(允许的令牌顺序)。

实际上运行代码发生在解释器成功完成这些两次传递之后;如果没有那么解释器所具有的所有信息都是发生了语法错误,它不知道你已经将error_reporting设置为某个级别或另一个级别,因为它认为它从文件读取的内容是“语法无效“因此无法运行它。

具体信息:

由于您使用的是PHP 5.4提供的新语法语言结构,但PHP 5.3没有,因此PHP 5.3中的合法PHP 5.4结构成为语法错误

在与语法错误相同的文件中调用error_reporting意味着不会发生函数调用,并且将无法正确设置错误级别。

解决方法:

通过在php.ini文件或.htaccess文件中声明错误级别来设置错误级别。

答案 1 :(得分:2)

在解析文件

之前发生解析错误

使用以下代码:

<?php
error_reporting(E_ALL^E_NOTICE);
ini_set('display_errors', 1);

echo explode('cms/', pageURL())[0]

在处理内容之前,需要对代码进行解析。默认情况下运行显示错误,您会看到:

  

解析错误:语法错误,意外'[',期待','或';'在第4行的index.php中

或类似的。如果存在解析错误 - 根本没有解析文件,则在任何文件内容(从未处理过,因为它是致命错误)之前处理错误,因此错误报告设置来自之前加载的文件适用。

相反,这会显示错误消息:

<?php
error_reporting(E_ALL^E_NOTICE);
ini_set('display_errors', 1);
require 'has_fatal_error.php';

<?php
// has_fatal_error.php;
echo explode('cms/', pageURL())[0]

答案 2 :(得分:0)

我不确定这一点,但这种特殊类型的错误可能属于E_STRICT。在PHP 5.4中,E_STRICT中包含E_ALL,但在5.3中则不包含{。}}。

无论是否修复此问题,将错误报告更改为

是明智的。
error_reporting(E_ALL ^ E_NOTICE | E_STRICT);

答案 3 :(得分:0)

如果apache加载的第一个文件包含解析错误,则代码永远不会运行。

答案 4 :(得分:-3)

您需要在ini文件short_open_tag = On中设置,否则您将收到错误