PHP将"调用非对象上的成员函数"转为异常

Ric*_*ich 14 php error-handling

当我运行"Behat"步骤时,Behat错误处理程序将"尝试获取非对象属性"错误转换为异常.

这非常有用,因为它会将步骤标记为失败,并允许测试运行在下一个场景中继续.

但是,"对非对象调用成员函数"错误是致命的,并立即停止测试执行(包括中止将结果写入xml).这是无益的.

我的问题是:

  1. 这两个错误有什么区别?它们是不同的"错误级别"吗?记录在哪里?我搜索过PHP网站和Google,并且找不到规范的参考,只是关于调试每个错误的特定实例的很多问题.

  2. 有没有办法将后一个错误转换为异常,而不是完全停止脚本?在我看来,null用" ->" 取消引用" " 将是一个"无法恢复,例如内存分配问题"的错误.

更新:

看起来这只是PHP的一个已知问题.看到:

  • #51882对非对象的成员函数调用应该抛出异常
  • #46601 E_RECOVERABLE_ERROR表示"调用非对象上的成员函数"
  • #51848非对象方法调用错误应该可以通过set_error_handler()获取
  • #63538 "调用未定义的函数"应该是可以捕获的

有人说这是"按设计",但我认为这只是在将对象添加到PHP之前定义的错误级别的假象.在一个非OO语言中,调用一个不存在的函数是一个严重的错误,我可以看到它如何被描述为"致命"或"不可恢复"(尽管,在非OO语言中,函数可以定义在即时,即使看起来过于悲观).现在,既然你可以$a->f()对任何旧版本做" " $a,那么" f"可能不存在的可能性更大,而且它似乎不应该是一个致命错误(参见Java,这将是一个NullPointerException).

我想这会引出一个新问题:

_ 3.如何修补PHP以使"对非对象的成员函数调用"错误非致命,而不会大幅破坏向后兼容性,以及您可以采取哪些步骤来最大化该补丁被PHP接受的可能性?

更新2重新修补PHP:

在PHP内部邮件列表中有一些有限的支持来进行此修复.现在我只需编写补丁来修复此问题并创建RFC.

Ric*_*ich 3

PHP 7 中已修复此问题:

在 PHP 7+ 中,此代码现在将抛出异常,而不是导致不可恢复的致命错误。