2010-10-01 9 views
30

Si uso array_walk dentro de una función de clase para llamar a otro en función de la misma clase¿Cómo uso un método de clase como función de devolución de llamada?

class user 
{ 
    public function getUserFields($userIdsArray,$fieldsArray) 
    { 

    if((isNonEmptyArray($userIdsArray)) && (isNonEmptyArray($fieldsArray))) 
    { 
     array_walk($fieldsArray, 'test_print'); 
    } 
    } 


    private function test_print($item, $key) 
    { 
     //replace the $item if it matches something 
    } 

} 

Me da el siguiente error -

Advertencia: array_walk() [function.array-pie]: No se puede llamar test_print() - función no existe en ...

Así que, ¿Cómo se especifica $this->test_print() WH Ile usando array_walk()?

+0

Cualquier razón por la que haya creado una función 'isNonEmptyArray' en lugar de simplemente usar'! empt y (...) '? –

+0

sí, solo devuelve verdadero si el parámetro es una matriz con al menos un valor no vacío –

Respuesta

58

Si desea especificar un método de clase como una devolución de llamada, es necesario que especifique el objeto al que pertenece:

array_walk($fieldsArray, array($this, 'test_print')); 

Desde el manual:

Un método de un objeto instanciado es pasado como una matriz que contiene un objeto en el índice 0 y el nombre del método en el índice 1.

Salida http://www.ideone.com/oz3Ma para ver esto en acción.

+0

Sí, lo intenté antes pero me da este error - 'Advertencia: array_walk() [function.array-walk: no se puede llamar Array() - la función no existe en' Sin embargo, esto está funcionando 'array_walk ($ fieldsArray, 'user :: test_print');'. Entonces, ¿qué está mal? Quería usar '$ this' –

+0

¿Qué versión de PHP? – tj111

+1

¿Puede mostrar el código exacto que no funciona (que emite esa advertencia)? – ircmaxell

5

Si necesita llamar a un método estático sin crear instancias de la clase que podría hacerlo:

// since PHP 5.3 
array_walk($fieldsArray, 'self::test_print'); 

O desde fuera:

// since PHP 5.5 
array_walk($fieldsArray, User::class.'::test_print'); 
1

Para llamar a un método de la clase como una función de devolución de llamada en otra método de clase, debe hacer:

public function compareFucntion() { 
} 

public function useCompareFunction() { 
    usort($arrayToSort, [$this, 'compareFucntion']) 
} 
Cuestiones relacionadas