【问题标题】:Invoking callable with optional parameters使用可选参数调用可调用对象
【发布时间】: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时这些参数还会被填上吗?
  • 查看答案。你错误地定义了错误处理程序。

标签: php function oop


【解决方案1】:

您错误地定义了错误处理程序。像这样定义:

set_error_handler(
    array($errorCollector, 'collect'),
);

【讨论】:

  • 我认为这行不通,它只会抛出一个错误,即您没有为 set_error_handler 函数提供正确的参数。
猜你喜欢
  • 2013-01-27
  • 2021-05-24
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多