정의 : 재정의, 즉 상위 클래스와 동일한 이름을 가진 멤버가 하위 클래스에 정의됩니다. 하위 클래스는 상위 클래스의 모든 클래스 멤버를 재정의할 수 있습니다. 일반적으로 재정의는 상위 클래스의 메서드를 재정의하는 데 사용됩니다. . 일부 비즈니스 로직을 확장하거나 변경하는 데 사용됩니다.
1. 공개 속성이든 보호 속성
이든 일단 재정의
되면 상위 클래스
의 속성은 존재하지 않습니다. 덮어쓰기로 인해 개인 속성
이 손실되지 않습니다. 受保护属性
,一旦重写
,父类
的属性就会不存在,而私有属性
不会因为被覆盖而丢失。
<?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 ?>
可以发现无论是公有属性
,还是受保护属性
都被覆盖
,而私有属性
因为没有被继承
,所以不受影响。
<?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>"; ?>
小结:公有、受保护的属性重写是直接覆盖父类成员,私有属性不会被覆盖;公有、收保护的方法会被重写,但是私有方法不会被重写(私有方法本质没有被继承)。
2.子类重写父类方法的要求。
a. 子类重写父类的方法,控制权不能高于父类,即子类可以比父类更开放。
<?php class Fu{ protected function show(){ echo __CLASS__,'<br/>'; } } class Zi extends Fu{ protected function show(){} //正确 public function show(){} //允许 private function show(){} //错误:控制权比父类更严格 } ?>
b. PHP中重写要求子类重写父类方法的时候,必须保证与父类同名方法参数一致。
<?php class Fu{ protected function show(){ echo __CLASS__,'<br/>'; } } class Zi extends Fu{ public function show(){} public function show($a){} //错误,与父类同名方法不一致 } ?>
c. 重写针对的是被继承的成员,父类私有方法不会被继承,因此不受要求b规定。
<?php class Fu{ private function show(){ echo __CLASS__,'<br/>'; } } class Zi extends Fu{ private function show($name){ //不会报错,因为本质不存在重写(父类Fu::show没有被继承) echo $name,'<br/>'; } } ?>
d.重写是指子类拥有特殊的情况,一般是需要在父类的基础上进行扩展,此时如果想要继续保证父类被重写的方法继续执行(默认永远只访问子类重写的新方法),需要在子类重写方法的时候使用parent
关键字。
<?php class Fu{ protected function show(){ echo __CLASS__,'<br/>'; } } class Zi extends Fu{ public function show(){ parent::show(); //扩展业务逻辑 echo __CLASS__,'<br/>'; } }?>
小结:parent
不能访问父类的属性,可以访问静态属性
、静态方法
、类常量
和普通方法
rrreee
공용 속성
과 보호 속성
은 모두
에 포함되는 반면 개인 속성
은 포함되는 것을 확인할 수 있습니다. 상속
되지 않으므로 영향을 받지 않습니다. rrreee 요약: 공용 및 보호 속성을 재정의하면 부모 클래스 멤버가 직접 재정의되고, 개인 속성은 덮어쓰지 않습니다. 공용 및 보호 메서드는 재정의되지만 개인 메서드는 재정의되지 않습니다(개인 메서드의 본질은 상속되지 않습니다). 2
🎜. 상위 클래스 메서드를 재정의하기 위한 하위 클래스 요구 사항입니다. 🎜🎜🎜🎜 a. 하위 클래스가 상위 클래스의 메서드를 재정의하는 경우 제어 권한은 상위 클래스보다 높을 수 없습니다. 즉, 하위 클래스가 상위 클래스보다 더 개방적일 수 있습니다. 🎜🎜rrreee🎜🎜 b. PHP에서 다시 작성하려면 하위 클래스가 상위 클래스 메서드를 다시 작성할 때 상위 클래스와 동일한 이름을 가진 메서드의 매개 변수가 일관되도록 해야 합니다. 🎜🎜rrreee🎜 🎜 c. 재정의는 상속된 멤버를 위한 것입니다. 상위 클래스의 전용 메서드는 상속되지 않으므로 요구 사항이 적용되지 않습니다. b. 🎜🎜rrreee🎜🎜 d. 재정의는 하위 클래스의 특별한 상황을 의미합니다. 일반적으로 이때 부모 클래스의 재정의된 메서드를 계속 보장하려면 상위 클래스를 기반으로 확장해야 합니다. 클래스는 계속 실행됩니다(기본값은 항상 하위 클래스에 의해 재정의된 새 메서드에 액세스하는 것입니다), 하위 클래스의 메서드를 재정의할 때parent
키워드를 사용해야 합니다. 🎜🎜rrreee🎜 🎜요약: parent
는 상위 클래스의 속성에 액세스할 수 없지만 정적 속성
, 정적 메서드
및 클래스 상수
및 일반 메소드
. 🎜🎜🎜🎜추천: 🎜php 튜토리얼🎜, 🎜php 비디오 튜토리얼🎜🎜🎜위 내용은 또 다른 기회가 있다면 재정의를 다시 작성하는 것이 탈출구입니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!