当我运行“Behat”步骤时,Behat 错误处理程序会将“尝试获取非对象的属性”错误转换为异常。
这非常有用,因为它会导致步骤被标记为失败,并允许测试运行在下一个场景中继续。
但是,“调用非对象上的成员函数”错误是致命的,并立即停止测试执行(包括中止将结果写入 xml)。这是无益的。
我的问题是:
这两个错误有什么区别?它们是不同的“错误级别”吗?这是在哪里记录的?我搜索了 PHP 站点和谷歌,找不到规范的参考,只有很多关于调试每个错误的特定实例的问题。
有没有办法将后一个错误转换为异常,而不是完全停止脚本?在我看来,
null
用“ ”取消引用“->
”不会是“无法恢复的错误,例如内存分配问题”。
更新:
看起来这只是 PHP 的一个已知问题。看:
- #51882调用非对象上的成员函数应引发异常
- #46601 E_RECOVERABLE_ERROR 用于“调用非对象上的成员函数”
- #51848非对象方法调用错误应该可以用 set_error_handler() 捕获
- #63538 “调用未定义的函数”应该是可捕获的
有人说这是“设计使然”,但我认为这只是在将对象添加到 PHP 之前定义的错误级别的产物。在非 OO 语言中,调用不存在的函数是一个严重错误,我可以看到它可能被描述为“致命”或“不可恢复”(尽管在可以定义函数的非 OO 语言中) ——苍蝇,即使这似乎过于悲观)。现在,既然您可以$a->f()
在任何 old 上执行 "" $a
,那么 "" 可能不存在的可能性要大得多f
,而且它似乎不应该是一个致命错误(参见 Java,这将是一个 NullPointerException)。
我想这让我想到了一个新问题:
_ 3. 您如何修补 PHP 以使“调用非对象上的成员函数”错误成为非致命错误,同时又不会严重破坏向后兼容性,以及您可以采取哪些步骤来最大限度地提高该修补程序被 PHP 接受的可能性?
更新 2重新修补 PHP:
PHP 内部邮件列表对进行此修复有一些有限的支持。现在我只需要编写一个补丁来解决这个问题并创建一个 RFC。