是否可以在PHP中防止“致命错误:调用未定义的函数”?

时间:2011-08-19 04:38:04

标签: php error-handling undefined fatal-error

在PHP中,有什么方法可以忽略未定义的函数而不是抛出在浏览器中可见的致命错误?-ie,致命错误:调用未定义函数

我知道有一种将所有自定义函数包装在条件中的做法,如下所示,但是有一种编程方式可以实现这种效果吗?

if (function_exists('my_function')) { 

   // use my_function() here;

}

6 个答案:

答案 0 :(得分:29)

没有。致命错误是致命的。即使您要编写自己的错误处理程序或使用@错误抑制运算符,E_FATAL错误仍会导致脚本停止执行。

处理此问题的唯一方法是使用function_exists()(可能is_callable()进行衡量),如上例所示。

对于潜在的(可能的?)错误进行防御性编码总是一个更好的想法,而不是仅仅让错误发生并在以后处理它。

编辑 - php7改变了这种行为,未定义的函数/方法是可捕获的异常。

答案 1 :(得分:7)

在php 7中,现在可以。

示例代码:

try {
    some_undefined_function_or_method();
} catch (\Error $ex) { // Error is the base class for all internal PHP error exceptions.
    var_dump($ex);
}

demo

http://php.net/manual/en/migration70.incompatible.php

  

许多致命和可恢复的致命错误已在PHP 7中转换为异常。这些错误异常继承自Error类,它本身实现了Throwable接口(所有异常继承的新基接口)。

答案 2 :(得分:1)

如果您想在处理对象时抑制此错误,请使用此功能:

function OM($object, $method_to_run, $param){ //Object method
    if(method_exists(get_class($object), $method_to_run)){
        $object->$method_to_run($param);
    }        
}

此致

答案 3 :(得分:0)

我们可以隐藏错误但这会记录apache错误日志

//设置显示错误为真。

ini_set('display_errors', "0");

//报告除通知外的所有错误

ini_set('error_reporting', E_ALL ^ E_NOTICE ^ E_STRICT);

//我们可以使用try catch方法

try {
    my_method();
} catch (\Error $ex) { // Error is the base class for all internal PHP error exceptions.
    var_dump($ex);
}

//检查方法是否存在

  

function_exists()

答案 4 :(得分:0)

防止没有。但是使用register_shutdown_function()

捕获并记录是的

请参阅PHP manual

function shutDown_handler()
{
   $last_error = error_get_last();
   //verify if shutwown is caused by an error
   if (isset ($last_error['type']) && $last_error['type'] == E_ERROR)
   {
      /*
        my activity for log or messaging
        you can use info: 
          $last_error['type'], $last_error['message'],
          $last_error['file'], $last_error['line']
          see about on the manual PHP at error_get_last()
      */
   }
}

register_shutdown_function ('shutDown_handler');

答案 5 :(得分:0)

我在 PHP 7 中发现 try/catch 适用于“调用未定义函数”错误。被捕获的异常对象不是 Throwable 类,也不是 ErrorException 而是 Error。

catch 收到的异常对象包含错误信息、文件和行号、堆栈跟踪,但不包含严重性代码。

此捕获允许程序进行自己的日志记录或分析,并从用户可见的输出中隐藏错误消息(但会将错误记录在 PHP 错误日志中),这正是生产网站上需要的。它还允许继续执行,这可能很危险,但您可以简单地放置“退出”;在 catch 代码块的末尾防止程序继续。