オブジェクトのプロパティに割り当てられたクロージャを直接呼び出す
オブジェクトのプロパティにクロージャを割り当てると、開発者は機能をオブジェクトに関連付けることができます。ただし、クロージャに直接アクセスすると問題が発生する可能性があります。
問題:
オブジェクト プロパティに割り当てられたクロージャを直接呼び出そうとすると、次のエラーが発生します:
Fatal error: Call to undefined method stdClass::callback().
これは、プロパティが __invoke() を持たないクロージャー オブジェクトとして保存されているためです。
PHP 7 以降の解決策:
PHP 7 以降では、次の構文が利用可能です:
$obj = new stdClass; $obj->fn = function($arg) { return "Hello $arg"; }; echo ($obj->fn)('World');
代わりに、Closure ::call() は使用できますが、 StdClass:
Closure::call($obj->callback, ['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 サイトの他の関連記事を参照してください。