Estoy tratando de ejecutar un método en cada elemento dentro de una colección. Es un método de objeto que reside en la misma clase:
protected function doSomething() { $discoveries = $this->findSomething(); $discoveries->each([$this, 'doSomethingElse']); } protected function doSomethingElse($element) { $element->bar(); // And some more } Si precedo la llamada en Collection::each con el cheque is_callable([$this, 'doSomethingElse']) devuelve verdadero, por lo que aparentemente es invocable. Sin embargo, la llamada en sí arroja una excepción:
Error de tipo: el argumento 1 pasado a Illuminate\Support\Collection::each() debe ser invocable, dado el arreglo, llamado en ---.php en la línea 46
El método que intenta ser llamado se puede encontrar aquí .
Estoy pasando por alto esto simplemente pasando un cierre que simplemente llama a esa función, pero definitivamente sería una solución mucho más limpia y no puedo averiguar por qué arroja el error.
Cambie la visibilidad de su método de devolución de llamada a público.
protected function doSomething() { $discoveries = $this->findSomething(); $discoveries->each([$this, 'doSomethingElse']); } public function doSomethingElse($element) { $element->bar(); // And some more }Desde PHP 7.1 puedes dejar tu función protegida. Ahora puedes escribir:
protected function doSomething() { $discoveries = $this->findSomething(); $discoveries->each(\Closure::fromCallable([$this, 'doSomethingElse'])); } protected function doSomethingElse($element) { $element->bar(); // And some more } No pude reproducir su error, pero supongo que debería usar $discoveries en lugar de $this en la matriz de devolución de llamada, así:
$discoveries->each([$discoveries, 'doSomethingElse']); Aunque $discoveries y $this son de la misma clase y, por lo tanto, pueden acceder a los métodos protegidos y privados de cada uno, es posible que la funcionalidad de sugerencia de tipo no verifique que el objeto en la matriz de devolución de llamada sea de la misma clase que la clase actual. Sin embargo, el método is_callable() verificará esto, lo que puede explicar por qué devuelve verdadero cuando lo llama desde dentro del método each() .
No hay ningún tipo llamado callable , por lo que cuando lo usa como sugerencia de tipo, se refiere a una clase llamada callable . Ver esta respuesta.