ホームページ > バックエンド開発 > PHPチュートリアル > PHP クラス オブジェクトでの __get() メソッドと __set() メソッドの使用に関するチュートリアル

PHP クラス オブジェクトでの __get() メソッドと __set() メソッドの使用に関するチュートリアル

WBOY
リリース: 2016-06-20 13:03:44
オリジナル
1026 人が閲覧しました

質問 1:

<p>class Test{</p><p>private $aa=1;</p><p>function __get($proName){return $this->proName;}</p><p>}</p><p>class subTest extends Test{</p><p>private $aa=2;</p><p>}</p><p>$test=new subTest();</p><p>echo $test->aa;</p>
ログイン後にコピー

なぜ 1 が出力されるのか説明してください。

答え: クラスの外部からプライベート プロパティにアクセスしようとすると、__get メソッドが呼び出されます (存在する場合)。subTest は Test クラスを継承して aa をオーバーライドしようとしますが、__get() メソッドはありません。 subTest クラスをインスタンス化した後、そのプライベート プロパティにアクセスすると、親クラスの __get メソッドがデフォルトで呼び出されます。 2 を出力したい場合は、サブクラスに __get を追加します。 ()

質問: 親クラスから継承したメソッドは、サブクラスのメンバー プロパティにアクセスできますか? 🎜>

回答: ここに出力 2 があります。サブクラスは親クラスから継承した属性 aa をオーバーライドし、それらはすべて保護されているため、
<p>class Test{</p><p>protected $aa=1; function __get($proName){return $this->$proName;}</p><p>}</p><p>class subTest extends Test{</p><p>protected $aa=2;</p><p>}</p><p>$test=new subTest();</p><p>echo $test->aa;</p>
ログイン後にコピー

をオーバーライドできます。質問:

答え: 今回の出力 1 は、サブクラスが親クラスの属性を上書きせず、独自の __get メソッドを持たないためです。同じ属性にアクセスすると、PHP はデフォルトでそれをプライベートとして認識します。つまり、親クラスを使用します。プライベートを識別した後、__get() メソッドが呼び出されるため、出力 1< に対応する __set() が呼び出されます。 🎜>
<p>class Test{</p><p>private $aa=1;</p><p>function __get($proName){</p><p>return $this->$proName;</p><p>}</p><p>class subTest extends Test{</p><p>protected $aa=2;</p><p>}</p><p>$test=new subTest();</p><p>echo $test->aa;</p>
ログイン後にコピー
は属性の値を設定します。原理は同様です。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート