PHP:捕获致命错误(调用非对象成员函数)

16

有时,我的脚本无法读取服务器的输出,出现以下错误:

PHP 致命错误:尝试在非对象上调用成员函数somefun()

这并不是我无法解决的问题,但会导致我的脚本崩溃。有没有一种方法可以在发生此特定错误时运行函数?我认为使用try-catch或类似方法并不实际,因为我需要找到每个调用成员函数并测试对象是否存在的实例(数千个)。


http://php.net/manual/en/book.errorfunc.php - Lawrence Cherone
我在手册中没有看到关于这个的任何内容。 - dukevin
你无法捕捉到致命错误。 - tereško
@octern 是的,但是我需要在成千上万个位置进行这个检查。我想知道是否有更好的方法。 - dukevin
2
有一个已批准的 RFC 使得这种错误可以被捕获: https://wiki.php.net/rfc/catchable-call-to-member-of-non-object 它还没有发布,但可能会在 PHP 的下一个小版本中发布。 - carlosvini
3个回答

46

PHP 7中

可以捕获"Error"可抛出对象,参见http://php.net/manual/zh/language.errors.php7.php

演示:https://3v4l.org/Be26l

<?php

$x = "not an object";

try {
 $x->foo();
} catch (\Throwable $t) {
 echo "caught";
}

在PHP 5中

有没有办法创建一个函数,当出现特定错误时运行该函数?

是的,您可以使用"register_shutdown_function",在遇到此错误后,在PHP死亡之前调用一个函数。

PHP:捕获致命错误(对非对象成员函数的调用)

如果您所说的“捕获”是指从此错误中恢复,那么这是不可能的,因为PHP已将“对非对象成员函数的调用”定义为“致命”错误。请参见PHP turn "Call to a member function on a non-object" into exception,了解一些关于为什么会这样的讨论。


0

我遇到的是哪个错误级别?E_ERROR吗?如果是,这样就行不通了。 - dukevin
对不起,你是正确的。创建一个虚拟函数是一个选项吗?还是函数名称是动态创建的? - PhilMasteG

-1

尝试使用function_exists来检查函数是否存在:

if (function_exists("somefun")) {
   ...
}

或者使用method_exists来验证类方法。


我已经知道这个解决方案,但问题是它可能会在代码的任何地方发生(也许有1000个不同的地方),我不想重复那么多次。 - dukevin
如果您能够捕获错误,您是否能够以通用的方式对其进行响应,以适用于所有1000个位置?或者,所有可能的错误条件是否都需要以不同的方式进行响应? - octern
我将能够适当地回应。 - dukevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接