Heim  >  Artikel  >  Backend-Entwicklung  >  Wenn Sie noch eine Chance haben, ist das Umschreiben von Override Ihr Ausweg

Wenn Sie noch eine Chance haben, ist das Umschreiben von Override Ihr Ausweg

autoload
autoloadOriginal
2021-03-03 17:20:211888Durchsuche

Definition : Überschreiben, das heißt, ein Mitglied mit demselben Namen wie die übergeordnete Klasse wird in der Unterklasse definiert. Die Unterklasse kann jedes Klassenmitglied der übergeordneten Klasse überschreiben . Zur Erweiterung oder Änderung einer Geschäftslogik.

1. Unabhängig davon, ob es sich um ein öffentliches Attribut oder ein geschütztes Attribut handelt, ist das Attribut der übergeordneten Klasse nach dem Überschreiben nicht mehr vorhanden. und Private Eigenschaften gehen durch Überschreiben nicht verloren. 受保护属性,一旦重写父类的属性就会不存在,而私有属性不会因为被覆盖而丢失。

<?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
?>

     可以发现无论是公有属性,还是受保护属性都被覆盖,而私有属性因为没有被继承,所以不受影响。

<?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不能访问父类的属性,可以访问静态属性静态方法类常量普通方法rrreee

Es ​​kann festgestellt werden, dass sowohl öffentliche Eigenschaften als auch geschützte Eigenschaften durch abgedeckt sind, während private Eigenschaften Da es nicht vererbt ist, ist es nicht betroffen.

rrreee Zusammenfassung: Das Überschreiben öffentlicher und geschützter Eigenschaften überschreibt direkt übergeordnete Klassenmitglieder, und private Eigenschaften werden nicht überschrieben; öffentliche und geschützte Methoden werden überschrieben, private Methoden jedoch nicht (private Methoden) Das Wesentliche wird nicht vererbt). 2

🎜 Anforderungen an Unterklassen zum Überschreiben von Methoden der übergeordneten Klasse. 🎜🎜🎜🎜 a. Wenn eine Unterklasse die Methode der übergeordneten Klasse überschreibt, dürfen die Kontrollrechte nicht höher sein als die der übergeordneten Klasse, dh die Unterklasse kann offener sein als die übergeordnete Klasse. 🎜🎜rrreee🎜🎜 Das Umschreiben in PHP erfordert, dass beim Umschreiben einer übergeordneten Klassenmethode sichergestellt werden muss, dass die Parameter der Methode mit demselben Namen wie die übergeordnete Klasse konsistent sind. 🎜🎜rrreee🎜 🎜 Das Überschreiben gilt für geerbte Mitglieder der übergeordneten Klasse, die nicht der Anforderung b unterliegen. 🎜🎜rrreee🎜🎜 d. Überschreiben bezieht sich auf die spezielle Situation der Unterklasse, die im Allgemeinen auf der Grundlage der übergeordneten Klasse erweitert werden muss. Wenn Sie weiterhin sicherstellen möchten, dass die überschriebene Methode der übergeordneten Klasse ist wird weiterhin ausgeführt (die Standardeinstellung ist immer nur Um auf neue Methoden zuzugreifen, die von Unterklassen überschrieben werden), müssen Sie das Schlüsselwort parent verwenden, wenn Sie Methoden in Unterklassen überschreiben. 🎜🎜rrreee🎜 🎜Zusammenfassung: parent kann nicht auf die Eigenschaften der übergeordneten Klasse zugreifen, kann aber auf statische Eigenschaften, statische Methoden und Klassenkonstanten und <code>gewöhnliche Methoden. 🎜🎜🎜🎜Empfohlen: 🎜php-Tutorial🎜, 🎜php-Video-Tutorial🎜🎜🎜

Das obige ist der detaillierte Inhalt vonWenn Sie noch eine Chance haben, ist das Umschreiben von Override Ihr Ausweg. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

In Verbindung stehende Artikel

Mehr sehen