【发布时间】:2016-05-17 15:51:47
【问题描述】:
PHP 中的set_error_handler 函数调用用户调用可调用对象作为第一个函数参数。我写了一个类,在调用这个其他函数之前必须完成一些指令。我是这样写的:
$errorCollector = new ErrorCollector();
set_error_handler(
call_user_func_array(
array($errorCollector, 'collect'),
array(function($error) {
//some instructions with $error
}))
);
来自$errorCollector 类的collect() 函数被调用,它需要一个非可选参数,即一个函数。
collect() 函数有 4 个其他参数,$errno、$errstr、$errfile 和 $errline。这些是在set_error_handler 函数中填充错误信息的参数。在set_error_handler 函数中使用这些参数调用可调用对象时,无需填写这些参数。
带有函数的类如下所示:
class ErrorCollector
{
private $errors;
public function collect(callable $handleError, $errno, $errstr, $errfile, $errline)
{
$error = array(
'number' => $errno,
'string' => $errstr,
'file' => $errfile,
'line' => $errline,
);
$this->errors[] = $error;
call_user_func($handleError, $error);
}
}
当我运行我的一段代码时,我收到以下错误:
警告:ErrorCollector::collect() 中缺少参数 2 C:\ErrorCollector.php 第 13 行
警告:ErrorCollector::collect() 中缺少参数 3 C:\ErrorCollector.php 第 13 行
警告:ErrorCollector::collect() 中缺少参数 4 C:\ErrorCollector.php 第 13 行
警告:ErrorCollector::collect() 中缺少参数 5 C:\ErrorCollector.php 第 13 行
(缩短文件 URL 以便于阅读)
当set_error_handler 函数的参数是可选的时,为什么会出现此错误?我可以使用可选参数调用可调用对象吗?
【问题讨论】:
-
ErrorCollector::collect有 5 个必需参数。但是你只通过了一个 -array(function($error) { //some instructions with $error })) -
@maximkou 是的,但是我如何使其他 4 个可选?因为这些在
set_error_handler函数中是可选的。 -
设置参数的默认值。像这样:
public function collect(callable $handleError, $errno = null, $errstr = null, $errfile = null, $errline = null) -
@maximkou 调用
set_error_handler时这些参数还会被填上吗? -
查看答案。你错误地定义了错误处理程序。