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