Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

333
Views
El argumento pasado a la función debe ser invocable, matriz dada

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.

about 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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 }
about 4 years ago · Santiago Trujillo Report

0

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 }

Fuente

about 4 years ago · Santiago Trujillo Report

0

PHP >= 5.4

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() .

PHP <5.4

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.

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!