web-dev-qa-db-fra.com

Comment utiliser une méthode de classe comme fonction de rappel?

Si j'utilise array_walk Dans une fonction de classe pour appeler une autre fonction de la même classe

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
  }

}

Cela me donne l'erreur suivante -

Avertissement: array_walk() [function.array-walk]: impossible d'appeler test_print() - la fonction n'existe pas dans ...

Alors, comment puis-je spécifier $this->test_print() tout en utilisant array_walk()?

38
Sandeepan Nath

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

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

Depuis le manuel :

Une méthode d'un objet instancié est passée sous la forme d'un tableau contenant un objet à l'index 0 et le nom de la méthode à l'index 1.

75

Si vous devez 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');
6
Artur Klesun

Pour appeler une méthode de classe en tant que fonction de rappel dans une autre méthode de classe, vous devez:

public function compareFucntion() {
}

public function useCompareFunction() {
  usort($arrayToSort, [$this, 'compareFucntion'])
}
1
Denise Ignatova