web-dev-qa-db-ja.com

PHP:クラス関数をコールバックとして使用する方法

コールバックとして使用したいメソッドを持つクラスがあります。それらを引数として渡す方法は?

Class MyClass {

    public function myMethod() {
        $this->processSomething(this->myCallback); // How it must be called ?
        $this->processSomething(self::myStaticCallback); // How it must be called ?
    }

    private function processSomething(callable $callback) {
        // process something...
        $callback();
    }

    private function myCallback() {
        // do something...
    }

    private static function myStaticCallback() {
        // do something...
    }   

}

PD:同じことを行う方法ですが、staticメソッドから($thisが利用できない場合)

74
SmxCde

callable manual をチェックして、関数をコールバックとして渡すさまざまな方法をすべて確認してください。このマニュアルをここにコピーし、シナリオに基づいて各アプローチの例をいくつか追加しました。

呼び出し可能


  • PHP関数は、名前として文字列として渡されます。 array()echoempty()などの言語構造を除く、任意の組み込み関数またはユーザー定義関数を使用できます。 eval()exit()isset()list()printまたはnset()
  // Not applicable in your scenario
  $this->processSomething('some_global_php_function');

  • インスタンス化されたオブジェクトのメソッドは、インデックスのオブジェクトとインデックス-のメソッド名を含む配列として渡されます1
  // Only from inside the same class
  $this->processSomething([$this, 'myCallback']);
  $this->processSomething([$this, 'myStaticCallback']);
  // From either inside or outside the same class
  $myObject->processSomething([new MyClass(), 'myCallback']);
  $myObject->processSomething([new MyClass(), 'myStaticCallback']);

  • 静的クラスメソッドも、インデックスでオブジェクトの代わりにクラス名を渡すことにより、そのクラスのオブジェクトをインスタンス化せずに渡すことができます =。
  // Only from inside the same class
  $this->processSomething([__CLASS__, 'myStaticCallback']);
  // From either inside or outside the same class
  $myObject->processSomething(['\Namespace\MyClass', 'myStaticCallback']);
  $myObject->processSomething(['\Namespace\MyClass::myStaticCallback']); // PHP 5.2.3+
  $myObject->processSomething([MyClass::class, 'myStaticCallback']); // PHP 5.5.0+

  • 一般的なユーザー定義関数とは別に、匿名関数をコールバックパラメータに渡すこともできます。
  // Not applicable in your scenario unless you modify the structure
  $this->processSomething(function() {
      // process something directly here...
  });

104
MikO

5.3にはもっとエレガントな書き方ができるので、それをもっと減らすことができるかどうかまだ調べようとしています

$this->processSomething(function() {
    $this->myCallback();
});
9
Bankzilla

Call_user_func()を使用してコールバックを指定することもできます。

public function myMethod() {

    call_user_func(array($this, 'myCallback'));
}

private function myCallback() {
    // do something...
}
6
Geovani Santos