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 メソッドは、アクセスできないプロパティへのデータの書き込みまたは読み取りの場合にのみ呼び出されると記載されています。
一般に、マジック メソッドは、適切なゲッター関数やセッター関数、または直接メソッド呼び出しの代替として見なすべきではありません。これらは主に、無効なプロパティ アクセスを処理し、そのようなシナリオで代替動作を提供するという目的を果たします。さらに、マジック メソッドは直接プロパティ アクセスに比べてパフォーマンスが低下する可能性があることに注意することが重要です。
元の質問で発生した問題に対処するには、明示的なゲッター メソッドとセッター メソッドを定義して、プロパティへのアクセスと変更。このアプローチはより効率的で、プロパティ アクセス セマンティクスをより詳細に制御できます。
以上がPHP の `__get` および `__set` マジック メソッドは実際にいつ呼び出されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。