2010-10-01 2 views
30

Si je array_walk dans une fonction de classe pour appeler une autre fonction de la même classeComment utiliser une méthode de classe en tant que fonction de rappel?

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 
    } 

} 

Il me donne l'erreur suivante -

Attention: array_walk() [function.array-marche]: Impossible appeler test_print() - fonction n'existe pas dans ...

Alors, comment puis-je préciser $this->test_print() wh en utilisant array_walk()?

+0

Une raison pour laquelle vous avez créé une fonction 'isNonEmptyArray' au lieu de simplement utiliser'! vide y (...) '? –

+0

oui, il ne retourne vrai que si le param est un tableau avec au moins une valeur non-vide –

Répondre

58

Si vous souhaitez spécifier une méthode de classe comme un rappel, vous devez spécifier l'objet auquel il appartient:

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

De l'manual:

Une méthode d'un objet instancié est transmis en tant que tableau contenant un objet à l'index 0 et le nom de la méthode à l'index 1.

Consultez http://www.ideone.com/oz3Ma pour voir ceci en action.

+0

Oui j'ai essayé cela avant mais cela me donne cette erreur - 'Warning: array_walk() [function.array-walk: Impossible d'appeler Array() - la fonction n'existe pas dans 'Cependant, cela fonctionne' array_walk ($ fieldsArray, 'user :: test_print'); '. Alors, qu'est-ce qui ne va pas? Je voulais utiliser '$ this' –

+0

Quelle version de PHP? – tj111

+1

Pouvez-vous montrer le code exact qui ne fonctionne pas (qui émet cet avertissement)? – ircmaxell

5

Si vous avez besoin d'appeler une méthode statique sans instancier la classe, vous pouvez le faire:

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

ou de l'extérieur:

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

Pour appeler une méthode de classe en fonction de rappel dans un autre méthode de classe, vous devriez faire:

public function compareFucntion() { 
} 

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