PHPでコールバックを実装するにはどうすればいいですか? 質問する

PHPでコールバックを実装するにはどうすればいいですか? 質問する

PHP ではコールバックはどのように記述されますか?

ベストアンサー1

マニュアルでは「コールバック」と「呼び出し可能」という用語を同じ意味で使用していますが、「コールバック」は伝統的に、呼び出しのように動作する文字列または配列値を指します。関数ポインタ、将来の呼び出しのために関数またはクラスメソッドを参照します。これにより、PHP 4 以降、関数型プログラミングのいくつかの要素が可能になりました。種類は次のとおりです。

$cb1 = 'someGlobalFunction';
$cb2 = ['ClassName', 'someStaticMethod'];
$cb3 = [$object, 'somePublicMethod'];

// this syntax is callable since PHP 5.2.3 but a string containing it
// cannot be called directly
$cb2 = 'ClassName::someStaticMethod';
$cb2(); // fatal error

// legacy syntax for PHP 4
$cb3 = array(&$object, 'somePublicMethod');

これは、一般的に呼び出し可能な値を使用する安全な方法です。

if (is_callable($cb2)) {
    // Autoloading will be invoked to load the class "ClassName" if it's not
    // yet defined, and PHP will check that the class has a method
    // "someStaticMethod". Note that is_callable() will NOT verify that the
    // method can safely be executed in static context.

    $returnValue = call_user_func($cb2, $arg1, $arg2);
}

$cb()最新の PHP バージョンでは、上記の最初の 3 つの形式を.として直接呼び出すことができ、call_user_func上記call_user_func_arrayのすべてがサポートされています。

見る:http://php.net/manual/en/language.types.callable.php

注意事項:

  1. 関数/クラスが名前空間化されている場合、文字列には完全修飾名が含まれている必要があります。例:['Vendor\Package\Foo', 'method']
  2. call_user_funcは非オブジェクトを参照渡しすることをサポートしていないため、 を使用するか、またはcall_user_func_array、それ以降の PHP バージョンでは、コールバックを var に保存して直接構文を使用するかのいずれかになります: $cb();
  3. オブジェクトには__invoke()メソッド (匿名関数を含む) は「呼び出し可能」カテゴリに分類され、同じように使用できますが、個人的にはこれらを従来の「コールバック」という用語と関連付けません。
  4. レガシーはcreate_function()グローバル関数を作成し、その名前を返します。これは のラッパーでありeval()、代わりに匿名関数を使用する必要があります。

おすすめ記事