我正在尝试对集合中的每个元素运行一个方法。它是驻留在同一类中的对象方法:
protected function doSomething()
{
$discoveries = $this->findSomething();
$discoveries->each([$this, 'doSomethingElse']);
}
protected function doSomethingElse($element)
{
$element->bar();
// And some more
}
如果我在Collection::each
上的调用之前使用支票is_callable([$this, 'doSomethingElse'])
它返回true,那么显然它是可调用的。然而,调用本身会引发异常:
类型错误:参数1传递给Illuminate \ Support \ Collection :: each()必须 可调用,给定数组,在第46行上调用--- .php
可以找到试图调用的方法here。
我绕过这个只是传递一个本身只是调用该函数的闭包,但这肯定是一个更清晰的解决方案,我无法找出它抛出错误的原因。
答案 0 :(得分:17)
将回调方法的可见性更改为公开。
protected function doSomething()
{
$discoveries = $this->findSomething();
$discoveries->each([$this, 'doSomethingElse']);
}
public function doSomethingElse($element)
{
$element->bar();
// And some more
}
答案 1 :(得分:6)
从PHP 7.1开始,您可以保护自己的功能。现在您可以编写:
protected function doSomething()
{
$discoveries = $this->findSomething();
$discoveries->each(\Closure::fromCallable([$this, 'doSomethingElse']));
}
protected function doSomethingElse($element)
{
$element->bar();
// And some more
}
答案 2 :(得分:-1)
我无法重现您的错误,但我的猜测是您应该在回调数组中使用$discoveries
而不是$this
,如下所示:
$discoveries->each([$discoveries, 'doSomethingElse']);
即使$discoveries
和$this
属于同一个类,因此可以访问彼此的受保护和私有方法,但类型提示功能可能无法检查回调数组中的对象是否为与当前班级相同的班级。但是,is_callable()
方法将检查这一点,这可以解释为什么当您从each()
方法内部调用它时它返回true。
没有名为callable
的类型,因此当您将其用作类型提示时,它指的是名为callable
的类。 See this answer.