ホームページ >バックエンド開発 >PHPチュートリアル >PHP でオブジェクトの Closure プロパティを直接呼び出せないのはなぜですか?それを修正するにはどうすればよいですか?
オブジェクト プロパティ クロージャを直接呼び出す
クロージャをオブジェクトのプロパティに割り当てる場合、クロージャを再割り当てせずに直接呼び出すことが困難になる場合があります。変数。次の例を考えてみましょう:
$obj = new stdClass(); $obj->callback = function() { print "HelloWorld!"; };
残念ながら、$obj->callback() を呼び出そうとすると、「致命的エラー: 未定義メソッド stdClass::callback() への呼び出し」というエラーが発生します。
PHP 7 ソリューション
PHP で7 では、アロー関数 (PHP 7.4 で導入) を使用すると、次のようにオブジェクトのプロパティに割り当てられたクロージャを直接呼び出すことができます:
$obj = new StdClass; $obj->fn = function($arg) { return "Hello $arg"; }; echo ($obj->fn)('World');
Closure::call()
7 より前のバージョンの PHP の場合は、Closure::call() 関数を使用することもできます。ただし、このメソッドは StdClass インスタンスには適用できません。
Magic __call メソッド
PHP 7 より前では、実行可能なアプローチは、インターセプトを可能にする Magic __call メソッドを実装することでした。未定義のメソッドの呼び出し。次の例では、Foo クラスが __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 本体内で同じメソッドが呼び出されないようにすることで無限再帰を回避していることに注意してください。
以上がPHP でオブジェクトの Closure プロパティを直接呼び出せないのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。