提问人:Creech 提问时间:9/9/2023 最后编辑:Creech 更新时间:9/9/2023 访问量:39
在 PHP 中,如果禁用 OPCache,有没有办法拦截编译时致命错误?
In PHP, is there a way to intercept a compile time fatal error, if OPCache is disabled?
问:
环境
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 OPcache
phpinfo()
我自己的猜测
在运行时加载接口代码后,PHP 将处于编译模式,并检查该类是否实现了接口声明的所有方法。但是,由于它处于编译模式,因此不会将致命错误传递给错误处理程序。
问题
有什么方法可以拦截这个错误并将其传递给全局错误处理程序,以便我可以捕获和记录它?
答: 暂无答案
评论
set_error_handler()
register_shutdown_function