PHP クラスのプライベート属性継承の問題の詳細な説明

WBOY
リリース: 2016-07-25 09:03:46
オリジナル
947 人が閲覧しました
  1. クラス従業員{

  2. private $sal=3000;
  3. //protected $sal=3000;
  4. public function getSal(){
  5. return $this->sal;
  6. }
  7. }
  8. クラスマネージャーは従業員を拡張します {
  9. protected $sal=5000;

  10. public function getParentSal(){

  11. //ここで返されるのは親クラスのプライベート属性です。
  12. return parent:: getSal();
  13. }
  14. }
  15. $manager = new Manager();
  16. echo "PHP ".phpversion()."
    ";
  17. echo $manager->getSal();
  18. echo "< br>";
  19. echo "parent's $sal ".$manager->getParentSal();
  20. ?>

コードをコピー

プログラムの実行結果: PHP5.3.8 3000 親の給料 3000ドル

親クラスの属性がサブクラスによってオーバーライドされる場合。 結果はこれです。 5 行目の属性定義が保護されることに注意してください。

  1. クラス従業員{
  2. //private $sal=3000;
  3. protected $sal=3000;
  4. public function getSal(){
  5. return $this->sal;
  6. }
  7. }

  8. クラスマネージャーは従業員を拡張します {

  9. protected $sal=5000;

  10. public function getParentSal(){

  11. //ここで返されるのはクラスの親 Private 属性。
  12. returnparent::getSal();
  13. }
  14. }
  15. $manager = new Manager();
  16. echo "PHP ".phpversion()."
    ";
  17. echo $ manager-> ;getSal();
  18. echo "
    ";
  19. echo "parent's $sal ".$manager->getParentSal();
  20. ?>

コードをコピー

プログラムの動作結果: PHP5.3.8 5000 親の給与5000ドル

最初の例では、親クラスのプライベート $sal がオーバーライドされていないため、親クラスのメソッド $manager->getSal() が親クラス独自のプライベート プロパティ $sal を呼び出します。この時点で、メモリ。 2 番目の列では、親クラスの保護された $sal がオーバーライドされます。この親クラスのメソッド $manager->getSal() は、オーバーライドされた $sal をこの時点ではメモリに存在しません。 $sal は 1 つだけです。 次に 3 番目の例を見てみましょう サブクラスでオーバーライドされたメソッドは、現在のプライベート クラスに対して有効です。

  1. クラス従業員{

  2. private $sal=3000;
  3. public function getSal(){
  4. return $this->sal;
  5. }
  6. }

  7. クラスマネージャーは従業員を拡張します {

  8. private $sal=5000;
  9. //メソッドを書き直しました
  10. public function getSal(){
  11. return $this->sal;
  12. }
  13. public function getParentSal(){
  14. //ここで返されるのは、親クラスのプライベート属性です。
  15. returnparent::getSal();
  16. }
  17. }
  18. $manager = new Manager();
  19. echo "PHP ".phpversion()."
    ";
  20. echo $manager->getSal();
  21. echo "
    ";
  22. echo "親の $sal ".$manager->getParentSal();
  23. ?>

コードをコピー

結果を実行 PHP5.3.8 5000 親の給料 3000ドル

この例では、サブクラスが getSal() メソッドをオーバーライドするため、呼び出されるのはサブクラスの属性です。 サブクラスのこの行をコメントすると //プライベート $sal=5000; E:wampwwwoo2-52-5-3.php の 14 行目で、次のエラーが表示されます。 Notice: Unknown property: Manager::$sal 12 行目のサブクラス rewrite メソッドをコメントアウトすると、 echo $manager->getSal(); の結果は親クラス 3000 のプライベート属性 $sal になります

zend デバッグ ステータスを開いて、メモリ内で何が起こっているかを確認します。下部に $sal が 2 つあることに注意してください。それぞれ 3000 と 5000 です。

  1. クラス従業員{
  2. private $sal=3000;
  3. パブリック関数getSal(){
  4. return $this->sal;
  5. }
  6. }
  7. クラスマネージャーは従業員{
  8. protected $salを拡張します=5000;
  9. public function getParentSal(){
  10. return $this->sal;
  11. }
  12. }
  13. $manager = new Manager();
  14. echo "PHP ".phpversion()."
    ";
  15. echo $manager->getSal();
  16. ?>
コードをコピー

プログラムの実行結果: PHP5.3.8 3000

親クラスの属性 $sal を protected に変更すると、サブクラスが親クラスの属性をオーバーライドします。メモリには $sal が 1 つだけあります。

  1. クラス従業員{
  2. protected $sal=3000;
  3. public function getSal(){
  4. return $this->sal;
  5. }
  6. }
  7. クラスマネージャーは従業員{
  8. protected $salを拡張します=5000;
  9. public function getParentSal(){
  10. return $this->sal;
  11. }
  12. }
  13. $manager = new Manager();
  14. echo "PHP ".phpversion()."
    ";
  15. echo $manager->getSal();
  16. ?>
コードをコピー

プログラムの実行結果: PHP5.3.8 5000 注意: PHP5 は、parent-> の代わりにparent:: を使用して親クラスを呼び出します。これは、PHP5 が親クラスをメモリ内に作成しないことを示すのに十分です。 PHP5 は Java よりも継承を単純化したいと考えています。



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