传递给函数的参数必须是可调用的,数组给定

2022-08-30 15:55:59

我正在尝试对集合中的每个元素运行一个方法。它是驻留在同一类中的对象方法:

protected function doSomething()
{
    $discoveries = $this->findSomething();
    $discoveries->each([$this, 'doSomethingElse']);
}

protected function doSomethingElse($element)
{
    $element->bar();
    // And some more
}

如果我在调用之前使用检查,它将返回 true,因此显然它是可调用的。但是,调用本身会引发异常:Collection::eachis_callable([$this, 'doSomethingElse'])

类型错误:传递给 Illuminate\Support\Collection::each() 的参数 1 必须是可调用的,给定的数组,在第 46 行的 ---.php 中调用

尝试调用的方法可以在这里找到。

我只是通过传递一个本身只是调用该函数的闭包来绕过这一点,但这绝对是一个更干净的解决方案,我无法找出为什么它会抛出错误。


答案 1

将回调方法的可见性更改为公共。

protected function doSomething()
{
    $discoveries = $this->findSomething();
    $discoveries->each([$this, 'doSomethingElse']);
}

public function doSomethingElse($element)
{
    $element->bar();
    // And some more
}

答案 2

从 PHP 7.1 开始,您可以保护函数。现在你可以写:

protected function doSomething()
{
    $discoveries = $this->findSomething();
    $discoveries->each(\Closure::fromCallable([$this, 'doSomethingElse']));
}

protected function doSomethingElse($element)
{
    $element->bar();
    // And some more
}


推荐