Maison > Article > développement back-end > Si vous avez une autre chance, la réécriture est votre solution.
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='张三'; protected $sex='man'; private $age='25'; public function getName(){ echo __CLASS__,'<br/>'; echo $this->name."<br>"; } protected function getSex(){ echo __CLASS__,'<br/>'; echo $this->sex."<br>"; } private function getAge(){ echo __CLASS__,'<br/>'; echo $this->age."<br>"; } } class B extends A{ public $name='王五'; protected $sex='woman'; private $age='26'; 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 ?>
On peut constater que 公有属性
et 受保护属性
sont 覆盖
, et 私有属性
n'est pas affecté car il ne l'est pas 继承
.
<?php class A{ public $name='张三'; protected $sex='man'; private $age='25'; 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='王五'; protected $sex='woman'; private $age='26'; 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>"; ?>
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__,'<br/>'; } } class Zi extends Fu{ protected function show(){} //正确 public function show(){} //允许 private function show(){} //错误:控制权比父类更严格 } ?>
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__,'<br/>'; } } class Zi extends Fu{ public function show(){} public function show($a){} //错误,与父类同名方法不一致 } ?>
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__,'<br/>'; } } class Zi extends Fu{ private function show($name){ //不会报错,因为本质不存在重写(父类Fu::show没有被继承) echo $name,'<br/>'; } } ?>
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__,'<br/>'; } } class Zi extends Fu{ public function show(){ parent::show(); //扩展业务逻辑 echo __CLASS__,'<br/>'; } }?>
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!