もう一度機会があれば、オーバーライドを書き直すことが解決策です

autoload
リリース: 2023-02-17 20:16:02
オリジナル
1898 人が閲覧しました

定義 : オーバーライド、つまり、親クラスと同じ名前のメンバーがサブクラスで定義されます。サブクラスは親クラスの任意のクラス メンバーをオーバーライドできます。オーバーライドは通常、オーバーライドするために使用されます。親クラスのメソッドは、一部のビジネス ロジックを拡張または変更するために使用されます。

1. public 属性であろうと protected 属性 であろうと、オーバーライド を行うと、parent class 属性は無効になります。 プライベート プロパティが存在し、上書きによって失われることはありません。

<?php
    class A{
      
        public $name=&#39;张三&#39;;
        protected $sex=&#39;man&#39;;
        private  $age=&#39;25&#39;;

        public function getName(){
           echo __CLASS__,&#39;<br/>&#39;;
           echo $this->name."<br>";
        }
        protected function getSex(){
            echo __CLASS__,&#39;<br/>&#39;;
            echo $this->sex."<br>";
        }
        private function getAge(){
            echo __CLASS__,&#39;<br/>&#39;;
            echo $this->age."<br>";
        }

    }
    class B extends A{
        
        public $name=&#39;王五&#39;;
        protected $sex=&#39;woman&#39;;
        private  $age=&#39;26&#39;;
    
        
        public function getAll(){
            echo $this->name."<br>";
            echo $this->sex."<br>";
            echo $this->age."<br>";
        }
    }

    $a=new B();
    var_dump($a);
    
  /* object(B)#1 (4) 
   { ["name"]=> string(6) "王五" 
     ["sex":protected]=> string(5) "woman" 
     ["age":"B":private]=> string(2) "26" 
     ["age":"A":private]=> string(2) "25"
   }*/
    
    echo "<br>";
    $a->getAll();//王五 woman 26
?>
ログイン後にコピー

public 属性protected 属性 の両方が によって上書きされ、private 属性# が上書きされることがわかります。 ## では継承されないため、影響を受けません。

<?php
    class A{
      
        public $name=&#39;张三&#39;;
        protected $sex=&#39;man&#39;;
        private  $age=&#39;25&#39;;

        public function getName(){
           
           echo $this->name."我是父类的getName"."<br>";
        }
        protected function getSex(){
            
            echo $this->sex."我是父类的getSex"."<br>";
        }
        private function getAge(){
            
            echo $this->age."我是父类的getAge"."<br>";
        }

    }
    class B extends A{
        
        public $name=&#39;王五&#39;;
        protected $sex=&#39;woman&#39;;
        private  $age=&#39;26&#39;;

        public function getName(){
           
           echo $this->name."我是子类的getName"."<br>";
        }
        protected function getSex(){
          
            echo $this->sex."我是子类的getSex"."<br>";
        }
        private function getAge(){
          
            echo $this->age."我是子类的getAge"."<br>";
        }
        public function getAll(){
            $this->getName();
            $this->getSex();
            $this->getAge();
        }
    }

    $a=new B();
    $a->getAll();//王五我是子类的getName woman我是子类的getSex 26我是子类的getAge
    echo "<br>";
?>
ログイン後にコピー

概要: パブリック プロパティとプロテクト プロパティをオーバーライドすると、親クラス メンバーが直接オーバーライドされ、プライベート プロパティは上書きされません。パブリック メソッドとプロテクト メソッドは書き換えられますが、プライベート メソッドはオーバーライドされません (プライベート メソッドの性質上)メソッドは継承されません)。

2. 親クラスのメソッドをオーバーライドするには、サブクラスが必要です。

a. サブクラスが親クラスのメソッドをオーバーライドする場合、制御権限は親クラスの制御権限よりも高くすることはできません。つまり、サブクラスは親クラスよりもオープンにすることができます。クラス。

<?php
class Fu{
    protected function show(){
        echo __CLASS__,&#39;<br/>&#39;;
    }
}
class Zi extends Fu{
    protected function show(){}				//正确
    public function show(){}				//允许
    private function show(){}				//错误:控制权比父类更严格
}
?>
ログイン後にコピー

b. PHP で書き換えるには、サブクラスが親クラスのメソッドを書き換えるときに、親クラスと同じ名前のメソッドのパラメーターが一貫していることを確認する必要があります。

<?php
class Fu{
    protected function show(){
        echo __CLASS__,&#39;<br/>&#39;;
    }
}
class Zi extends Fu{
    public function show(){}
    public function show($a){}			//错误,与父类同名方法不一致
}
?>
ログイン後にコピー

c. 書き換えは継承されたメンバーに対して行われます。親クラスのプライベート メソッドは継承されないため、要件 b の対象にはなりません。

<?php
class Fu{
    private function show(){
        echo __CLASS__,&#39;<br/>&#39;;
    }
}
class Zi extends Fu{
    private function show($name){		//不会报错,因为本质不存在重写(父类Fu::show没有被继承)
        echo $name,&#39;<br/>&#39;;
    }
}
?>
ログイン後にコピー

d. 書き換えとは、サブクラスの特殊な状況を指します。通常、親クラスをベースに拡張する必要があります。親クラスが書き換えられることを確認する メソッドは実行を継続します (デフォルトでは、サブクラスによってオーバーライドされた新しいメソッドのみが常にアクセスされます) サブクラスのメソッドを書き換えるときは、parent キーワードを使用する必要があります。

<?php
class Fu{
    protected function show(){
        echo __CLASS__,&#39;<br/>&#39;;
    }
}
class Zi extends Fu{
    public function show(){
        parent::show();
        
        //扩展业务逻辑
        echo __CLASS__,&#39;<br/>&#39;;
    }
}?>
ログイン後にコピー

概要: parent は親クラスのプロパティにはアクセスできませんが、静的プロパティ静的メソッド##にはアクセスできます。 #,クラス定数共通メソッド

推奨:

php チュートリアルphp ビデオ チュートリアル

以上がもう一度機会があれば、オーバーライドを書き直すことが解決策ですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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