web-dev-qa-db-ja.com

クラスメソッドをコールバック関数として使用するにはどうすればよいですか?

クラス関数内で_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()を指定するにはどうすればよいですか?

38
Sandeepan Nath

クラスメソッドをコールバックとして指定する場合は、それが属するオブジェクトを指定する必要があります。

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

manual から:

インスタンス化されたオブジェクトのメソッドは、インデックス0のオブジェクトとインデックス1のメソッド名を含む配列として渡されます。

75

クラスをインスタンス化せずに静的メソッドを呼び出す必要がある場合は、次のようにすることができます。

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

または外部から:

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

クラスメソッドを別のクラスメソッドのコールバック関数として呼び出すには、次のようにします。

public function compareFucntion() {
}

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