「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > PHP の `__get` および `__set` マジック メソッドは実際にいつ呼び出されますか?

PHP の `__get` および `__set` マジック メソッドは実際にいつ呼び出されますか?

2024 年 11 月 19 日に公開
ブラウズ:661

When are PHP's `__get` and `__set` magic methods actually invoked?

PHP マジック メソッド: プロパティのオーバーロードのための __get および __set の公開

PHP では、__get および __set マジック メソッドは、プロパティのオーバーロードを処理するための代替方法を提供します。従来のゲッターやセッターを超えたプロパティへのアクセスと変更。これらのメソッドを使用すると、開発者は、要求されたプロパティが明示的に定義されていない場合に、プロパティ アクセスの動作をインターセプトしてカスタマイズできます。

ただし、よくある誤解は、__get メソッドと __set メソッドが get キーワードと set キーワードのオーバーロードに使用されるということです。これは完全に正確ではありません。

プロパティのオーバーロードとマジック メソッド

__get メソッドと __set メソッドはプロパティ オーバーロードの形式に使用できますが、一般的なオーバーロードとは異なります。他の言語のメソッド。 PHP は、パブリック、プロテクト、およびプライベートのプロパティ宣言を通じてプロパティへのアクセスを明示的に処理します。プロパティが指定されたスコープ内で宣言されていない場合、PHP はエラーを生成します。

PHP が明示的に宣言されていないプロパティにアクセスしようとすると、マジック メソッドが機能します。この場合、__get メソッドと __set メソッドは、プロパティ アクセスを動的に処理する方法を提供します。

__get と __set の使用

__get メソッドと __set メソッドの使用法を説明するには、次のようにします。次の例を考えてみましょう:

class foo {
    public $bar;  // Public property
    public function __get($name) {
        echo "Get:$name";
        return $this->$name;  // Custom behavior for accessing inaccessible properties
    }
    public function __set($name, $value) {
        echo "Set:$name to $value";
        $this->$name = $value;  // Custom behavior for setting inaccessible properties
    }
}

このシナリオでは、__get メソッドと __set メソッドは、$bar プロパティにアクセスまたは変更するときにカスタム動作を提供するように設計されています。たとえば、 echo $foo->bar; を呼び出します。 $foo->bar = 'test'; の場合、__get メソッドがトリガーされます。

デバッグと一般的な落とし穴

ただし、元の質問で説明したように、プロパティがすでに公開されている場合 (この例のように)の場合、PHP ランタイムはそのプロパティに直接アクセスします。したがって、__get メソッドと __set メソッドは呼び出されません。

この動作は、PHP マニュアルのプロパティのオーバーロードに関するセクションで確認されており、__set メソッドと __get メソッドは、アクセスできないプロパティにデータを書き込んだり読み込んだりする場合にのみ呼び出されると記載されています。パブリック プロパティではありません。

一般に、マジック メソッドは、適切な getter 関数や setter 関数、または直接メソッド呼び出しの代替として見なされるべきではありません。これらは主に、無効なプロパティ アクセスを処理し、そのようなシナリオで代替動作を提供するという目的を果たします。さらに、マジック メソッドは直接プロパティ アクセスに比べてパフォーマンスが低下する可能性があることに注意することが重要です。

元の質問で発生した問題に対処するために、明示的なゲッター メソッドとセッター メソッドを定義できます。プロパティへのアクセスと変更。このアプローチはより効率的で、プロパティ アクセス セマンティクスをより詳細に制御できます。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3