オブジェクト プロパティに割り当てられたクロージャを直接呼び出す
PHP では、オブジェクト プロパティに割り当てられたクロージャを直接呼び出す場合、制限があります。提供されたコードに示すように:
$obj = new stdClass(); $obj->callback = function() { print "HelloWorld!"; }; $obj->callback();
このコードは、「致命的エラー: 未定義メソッド stdClass::callback() の呼び出し」というエラーで失敗します。これを解決するために、PHP 7 では直接呼び出しメソッドが導入されました。
PHP 7 以降
PHP 7 以降では、オブジェクト プロパティに割り当てられたクロージャを次を使用して直接呼び出すことができます。次の構文:
$obj = new stdClass; $obj->fn = function($arg) { return "Hello $arg"; }; echo ($obj->fn)('World');
PHP 以前7
PHP 7 より前では、オブジェクトのプロパティに割り当てられたクロージャーを直接呼び出すことはできませんでした。代わりに、呼び出しをインターセプトしてクロージャを呼び出すマジック __call メソッドを実装する必要がありました。
class Foo { public function __call($method, $args) { if(is_callable(array($this, $method))) { return call_user_func_array($this->$method, $args); } // else throw exception } } $foo = new Foo; $foo->cb = function($who) { return "Hello $who"; }; echo $foo->cb('World');
注: __call では、 call_user_func_array(array($this) の呼び出しを避けることが重要です。 、$method)、$args);これにより無限再帰がトリガーされるためです。
以上がPHPでオブジェクトプロパティに割り当てられたクロージャを直接呼び出す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。