我在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块会在出现错误时捕获异常。为什么我的回调在超类中不起作用?
答案 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_handler")});
}
答案 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。