【问题标题】:PHP - pass an extra parameter (variable) to set_exception_handlerPHP - 将一个额外的参数(变量)传递给 set_exception_handler
【发布时间】:2012-03-23 09:36:08
【问题描述】:

有没有办法将变量传递给 PHP 中的 set_exception_handler() 方法?我需要这样的东西:

class Clazz {

    public /* static */ function foo() {
        set_exception_handler(array('Clazz', 'callback'), $var); // I need to pass $var

         // or this in non-static context
         $that = $this;
         set_exception_handler(array($that, 'callback'), $var); // I need to pass $var
    }

    public static function callback($exception, $var) {
        // process $exception using $var
    }
}

【问题讨论】:

  • 为什么不将 Exception 类扩展为可以取出这些变量的类?比如new myException(...,...,$var),然后在处理程序中$e->getVar()
  • 我在 foo() 方法中调用了一些库。它们中的代码会引发异常,我无法更改它。既不重新定义异常,也不避免它们。
  • 使用 lambda 函数怎么样?
  • 是的,我需要这样的东西。但是我该如何使用它呢?我在手册页中没有找到使用 set_exception_handler 执行此操作的任何选项。
  • 能否将标题更改为更能代表实际问题的内容?这相当具有误导性。

标签: php variables exception-handling callback closures


【解决方案1】:

正如我在评论中已经指出的,无论如何你都必须使用 lambda 函数:

 $lambda = function($exception) use ($var) {
    Clazz::callback($exception,$var);
 }

 set_exception_handler($lambda);

【讨论】:

  • 在调用 set_exception_handler 时如何将 $var 的实际值传递给回调?没有这样的选择。
  • 你能指定这个吗?通过 use ($var) 将 $var 赋予函数。这意味着它将在您的 lambdaFunction 中修复
【解决方案2】:

使用回调

set_exception_handler(function($exception) use($var){
    $that->callback($exception, $var);
});

【讨论】:

    【解决方案3】:

    一种可能性是捕获异常并重新抛出具有此自定义属性的派生异常。

    class MyLibraryException extends LibraryException {
        function __construct(LibraryException $e, $custom_field){
             $this->custom_field = $custom_field;
             ...
        }
    }
    
    try {
        ...
    } catch(LibraryException $e) {
        new MyLibraryException($e, $cusotm_field);
    }
    

    【讨论】:

    • 嗯,我猜那是他不想做的事,因为我已经评论他这样做了
    • 他说他不能更改库中的代码,但我的建议不需要这样的更改。所以我想这可能对他有用......
    • 如果我知道库中的各种异常,这很有用。毕竟它会起作用,但如果可能的话,我想要更优雅的东西。但是,感谢您的解决方案。还要感谢@androidavid,他在上面提出了类似的建议。
    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 2019-10-08
    • 2018-10-07
    • 1970-01-01
    • 2011-03-06
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多