【发布时间】:2017-02-24 02:15:47
【问题描述】:
在我当前的配置中,每当某些 PHP 文件出现致命错误(例如语法错误或调用不存在的函数)时,我通常会收到如下错误消息:
Parse error: syntax error, unexpected <whatever> in /path/to/file.php on line XXX
或
Fatal error: Call to undefined function whatever() in /path/to/file.php on line YYY
或类似的输出。
但是,我正在使用使用第三方自动加载器的第三方库。每当在任何自动加载的类中出现致命错误(包括解析错误或调用不存在的函数 - 实际上并不完全确定后者但肯定是解析错误情况),我只会得到一个 空白页,不仅如此:在 Apache 的 error_log 文件中甚至没有记录任何错误,通常会记录 PHP 致命错误。所以调试变得不可能。
我怎么强调都不为过:这只有在在某些自动加载的文件中出现致命错误时才会发生。在所有其他情况下(当然包括通过require()、include() 等包含的文件中的错误),输出和error_log 中都会出现相同的错误。
autoloader的代码不是我写的,但基本上是这样的:
// no idea why this line, but I don't think it's relevant:
ini_set('unserialize_callback_func', 'spl_autoload_call');
spl_autoload_register(array('My_Autoloader', 'autoload'), true);
class My_Autoloader {
static function autoload($classname) {
$filename = //.... computes $filename from $classname
require_once($filename);
}
}
如果错误不在自动加载的文件中,必须有一种方法让自动加载器抛出错误(和处理)相同的方式,对吧?
我如何得到它?
【问题讨论】:
-
从我的评论中得到答案
-
但是这个
Fatal error: Call to undefined function whatever()与语法错误无关。 -
在 PHP7 中,大多数致命错误都已转换为可捕获的异常。 trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7
-
您可以静态分析所有文件以消除命令行中的解析错误问题,例如在 Unixoid 上(在您的代码根目录中):
find -type f -exec php -l {} \; > /dev/null
标签: php autoloader spl-autoload-register