Maison > développement back-end > PHP7 > Si vous avez une autre chance, la réécriture est votre solution.

Si vous avez une autre chance, la réécriture est votre solution.

autoload
Libérer: 2023-02-17 20:16:02
original
1924 Les gens l'ont consulté

Définition  : Override, c'est-à-dire que la sous-classe définit des membres portant le même nom que la classe parent. La sous-classe peut remplacer n'importe quel membre de la classe parent. Généralement, le remplacement est utilisé pour remplacer les méthodes de la classe parent. la classe parent est utilisée pour étendre ou modifier une logique métier.

1. Qu'il s'agisse d'un attribut public ou de 受保护属性, une fois 重写, les attributs de 父类 n'existeront pas et 私有属性 ne seront pas perdus car écrasés.

<?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
?>
Copier après la connexion

On peut constater que 公有属性 et 受保护属性 sont 覆盖, et 私有属性 n'est pas affecté car il ne l'est pas 继承.

<?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>";
?>
Copier après la connexion

Résumé : le remplacement des propriétés publiques et protégées remplace directement les membres de la classe parent, et les propriétés privées ne seront pas écrasées ; les méthodes publiques et protégées seront réécrites, mais les méthodes privées ne seront pas remplacées (la nature du privé) les méthodes ne sont pas héritées).

2. Conditions requises pour que les sous-classes remplacent les méthodes de la classe parent.

a. La sous-classe remplace la méthode de la classe parent et les droits de contrôle ne peuvent pas être supérieurs à ceux de la classe parent, c'est-à-dire que la sous-classe peut être plus ouverte que le parent. classe.

<?php
class Fu{
    protected function show(){
        echo __CLASS__,&#39;<br/>&#39;;
    }
}
class Zi extends Fu{
    protected function show(){}				//正确
    public function show(){}				//允许
    private function show(){}				//错误:控制权比父类更严格
}
?>
Copier après la connexion

b. La réécriture en PHP nécessite que lorsqu'une sous-classe réécrit une méthode de classe parent, elle doit s'assurer que les paramètres de la méthode portant le même nom que la classe parent sont cohérents.

<?php
class Fu{
    protected function show(){
        echo __CLASS__,&#39;<br/>&#39;;
    }
}
class Zi extends Fu{
    public function show(){}
    public function show($a){}			//错误,与父类同名方法不一致
}
?>
Copier après la connexion

c. La réécriture est destinée aux membres hérités. Les méthodes privées de la classe parent ne seront pas héritées, elles ne sont donc pas soumises à l'exigence 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;;
    }
}
?>
Copier après la connexion

d. La réécriture fait référence à la situation particulière de la sous-classe. Généralement, elle doit être étendue en fonction de la classe parente. assurez-vous que la classe parent est réécrite. La méthode continue de s'exécuter (par défaut, seules les nouvelles méthodes remplacées par les sous-classes sont toujours accessibles. Vous devez utiliser le mot-clé parent lors de la réécriture des méthodes dans les sous-classes).

<?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;;
    }
}?>
Copier après la connexion

Résumé : parent ne peut pas accéder aux attributs de la classe parent, mais peut accéder à 静态属性, 静态方法, 类常量 et 普通方法.

Recommandé : tutoriel php,tutoriel vidéo php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal