質問 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<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>は属性の値を設定します。原理は同様です。