在 PHP 中,如果禁用 OPCache,有没有办法拦截编译时致命错误?

In PHP, is there a way to intercept a compile time fatal error, if OPCache is disabled?

提问人:Creech 提问时间:9/9/2023 最后编辑:Creech 更新时间:9/9/2023 访问量:39

问:

环境

PHP 7.3 的 .我有一个自动加载器,可以在代码执行期间加载类和接口。此外,我还有一个全局错误处理程序,可以处理所有类型的错误( )。处理所有错误意味着,它创建一个并抛出它。代码包含在 try-catch 中。并且 catch 代码会记录 类型的所有对象。所有提到的工作都很好,除了......error_reporting(E_ALL)ErrorException\Throwable

问题

如果一个类实现了一个接口,但我忘记了实现一个方法,或者在方法名称中有一个拼写错误,PHP不会将错误传递给全局错误处理程序。它只创建一条消息并将其直接写入输出。该消息如下所示:

<br />
<b>Fatal error</b>:  Class classABC contains 1 abstract method and must therefore be declared abstract or 
implement the remaining methods ( interfaceXYZ::method123 ) in <b>example.php</b> on line <b>6</b><br />

附加信息

在我的网络研究中,我读到了PHP运行时与编译时间,如果OPcache被禁用,它们是无法区分的。调试显示,消息在运行时写入输出,这意味着当代码执行到达引用类的代码时,自动加载程序加载类,然后加载接口代码。在我的网络研究中,我读到了 OPcode 和 OPcache。据我了解,我相信这意味着,OPcaching在服务器上被禁用。此外,没有显示名为 的模块。以防万一这对解决方案很重要。 此外,使用调试器显示,此错误永远不会传递到全局错误处理程序。Zend OPcachephpinfo()

我自己的猜测

在运行时加载接口代码后,PHP 将处于编译模式,并检查该类是否实现了接口声明的所有方法。但是,由于它处于编译模式,因此不会将致命错误传递给错误处理程序。

问题

有什么方法可以拦截这个错误并将其传递给全局错误处理程序,以便我可以捕获和记录它?

php 处理 编译器错误

评论

4赞 Alex Howansky 9/9/2023
这是一个编译时错误,它无法被捕获,也不应该进入生产环境。这与语法错误(如缺少右大括号)没有什么不同。一个简单的静态分析工具,如 PHPStan,在提交前钩子或服务器端管道中运行,会在部署之前发现这些问题。哎呀,即使是你的基本IDE也会用红色突出显示这样的代码。set_error_handler()
1赞 Leroy 9/9/2023
你无法抓住它们,但你可以在这里使用类似的方式报告它们。但这可能无法满足您的要求。就像@AlexHowansky提到的,这是一个编译错误。当 php 尝试加载类时,它会失败(因此是致命的)。register_shutdown_function

答: 暂无答案