在Phil Sturgeon的REST控制器中为set_error_handler创建回调

时间:2014-03-05 14:26:54

标签: php codeigniter

我在CodeIgniter中使用Phil Sturgeon的REST_Controller,但是我想以像我这样的老Java程序员更熟悉的方式使用try ... catch块。所以,我给菲尔的控制器增加了一个功能:

    function exception_error_handler($errno, $errstr, $errfile, $errline, $errcontext){
        $ee = new ErrorException($errstr, 0, $errno, $errfile, $errline, $previous);
        throw $ee;
    }

然后在控制器的__construct方法中,我尝试将该函数连接到错误处理:

    set_error_handler("exception_error_handler");

当我现在运行扩展REST_Controller的控制器时,我收到以下错误消息:

  

set_error_handler()期望参数(exception_error_handler)为   是一个有效的回调

如果我将函数和调用set_error_handler放在子类中,则没有错误,我的try ... catch块会在出现错误时捕获异常。为什么我的回调在超类中不起作用?

2 个答案:

答案 0 :(得分:3)

您的子类继承了父级的构造函数。

set_error_handler(array($this, 'exception_error_handler'));

修改

设置后:

function exception_error_handler($errno, $errstr, $errfile, $errline, $errcontext){
        $ee = new ErrorException($errstr, 0, $errno, $errfile, $errline, $previous);
        throw $ee;
    }

TO:

protected static function exception_error_handler($errno, $errstr, $errfile, $errline, $errcontext){
        $ee = new ErrorException($errstr, 0, $errno, $errfile, $errline, $previous);
        throw $ee;
    }

您应该可以按如下方式调用它:

__construct(){
set_error_handler(function(){self::exception_error_handler("exception_error_han‌​dler")});
}

答案 1 :(得分:1)

我很感谢user3345621指出了我正确的方向。我将set_error_handler的PHP手册条目向下滚动到评论中,并找到了一条关于设置回调函数的3种方法的建议。

在REST_Controller中,我添加了原始问题中提到的exception_error_handler函数,不同之处在于我按照用户3345621的建议将其设置为静态。

protected static function exception_error_handler($errno, 
                                                  $errstr, 
                                                  $errfile, 
                                                  $errline, 
                                                  $errcontext){
        $ee = new ErrorException($errstr, 0, $errno, $errfile, $errline, $previous);
        throw $ee;
    }

然后我注意到REST_Controller中的early_checks方法。我在early_checks方法中添加了以下对set_error_handler的调用:

set_error_handler(array(&$this, 'exception_error_handler'));

PHP手册中的评论说&符号非常重要。

现在,当子类发生错误时,会抛出ErrorException。