Как использовать метод класса в качестве функции обратного вызова? - PullRequest
36 голосов
/ 01 октября 2010

Если я использую array_walk внутри функции класса для вызова другой функции того же класса

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
  }

}

Это дает мне следующую ошибку -

Предупреждение: array_walk() [function.array-walk]: Невозможно вызвать test_print() - функция не существует в ...

Итак, как мне указать $this->test_print() при использовании array_walk()?

Ответы [ 3 ]

68 голосов
/ 01 октября 2010

Если вы хотите указать метод класса в качестве обратного вызова, вам нужно указать объект, которому он принадлежит:

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

Из руководства :

Метод экземпляра объекта передается как массив, содержащий объект с индексом 0 и имя метода с индексом 1.

6 голосов
/ 07 сентября 2016

Если вам нужно вызвать статический метод без создания экземпляра класса, вы можете сделать это:

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

Или извне:

// since PHP 5.5
array_walk($fieldsArray, User::class.'::test_print');
1 голос
/ 28 июня 2017

Чтобы вызвать метод класса как функцию обратного вызова в другом методе класса, вы должны сделать:

public function compareFucntion() {
}

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