PHP从回调中获取对象

时间:2018-01-17 20:08:28

标签: php object callback

我想从回调函数中获取错误对象。这是我到目前为止所做的。

$errors = null;

set_exception_handler(function($exception) use (&$errors) {
  $errors = $exception;

   var_dump($exception); // works fine      

});

var_dump($errors); // give null ???? 


throw new Exception("blablblablablabla", 0);

我确信使用匿名函数,变量可以正常工作!  但在这种情况下使用回调和对象我不知道发生了什么?我无法理解我的头脑。任何帮助解释都会非常感激。

2 个答案:

答案 0 :(得分:2)

set_exception_handler不会停止执行。它只定义了异常发生时会发生什么,因此设置后可能会出现var_dump($errors);错误。 $errors此时仍然为null,因为您已将其设置为null,并且尚未发生任何更改。

停止执行的事情是当实际发生异常并且调用set_exception_handler中定义的匿名函数时。此时,调用该函数中的var_dump($exception);,但不会执行发生异常的点之后主程序中的任何其他代码。

在异常处理程序中将异常存储在全局变量中并没有真正意义,因为如果调用异常处理程序,主程序中将不再执行任何代码,因此您将无法使用那个变量无论如何。

答案 1 :(得分:1)

您将匿名函数指定为set_exception_handler()的异常处理程序。

但是你不会在你的代码中抛出异常。因此,永远不会调用匿名函数,因为没有要处理的事件,这意味着从未设置$error

如果添加try catch块,也不会调用您的函数。这可以通过以下事实看出:处理程序中的行var_dump($exception)也未被调用。

如果要在代码中存储最后一个被调用的异常,则可能需要使用围绕该代码的包装函数,该函数使用try catch覆盖遇到上一个异常的静态资源。

请注意,给定函数中的异常永远不会被完全抛出,因为它被包装器捕获了!

class Catcher {
    private static $_EXCEPTION = null;

    public static function GET_EXCEPTION () {
        return self::$_EXCEPTION;
    }

    public static function run($func) {
        try {
            return $func();
        } catch (Exception $e) {
            self::$_EXCEPTION = $e;
        }
    }
}

var_dump(Catcher::GET_EXCEPTION()); //dumps NULL

Catcher::run(function(){
    throw new Exception('I was called');
});


var_dump(Catcher::GET_EXCEPTION()); //dumps the last thrown exception