ホームページ >バックエンド開発 >PHPチュートリアル >PHP でオブジェクトの Closure プロパティを直接呼び出せないのはなぜですか?それを修正するにはどうすればよいですか?

PHP でオブジェクトの Closure プロパティを直接呼び出せないのはなぜですか?それを修正するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-17 18:30:10324ブラウズ

Why Can't I Directly Call an Object's Closure Property in PHP, and How Can I Fix It?

オブジェクト プロパティ クロージャを直接呼び出す

クロージャをオブジェクトのプロパティに割り当てる場合、クロージャを再割り当てせずに直接呼び出すことが困難になる場合があります。変数。次の例を考えてみましょう:

$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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。