定義 : オーバーライド、つまり、親クラスと同じ名前のメンバーがサブクラスで定義されます。サブクラスは親クラスの任意のクラス メンバーをオーバーライドできます。オーバーライドは通常、オーバーライドするために使用されます。親クラスのメソッドは、一部のビジネス ロジックを拡張または変更するために使用されます。
1. public 属性であろうと protected 属性
であろうと、オーバーライド
を行うと、parent class
属性は無効になります。 プライベート プロパティ
が存在し、上書きによって失われることはありません。
<?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 ?>
public 属性
と protected 属性
の両方が によって上書きされ、
private 属性# が上書きされることがわかります。
## では継承されないため、影響を受けません。
<?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 は親クラスのプロパティにはアクセスできませんが、
静的プロパティ、
静的メソッド##にはアクセスできます。 #,クラス定数
と共通メソッド
。
php チュートリアル、php ビデオ チュートリアル
以上がもう一度機会があれば、オーバーライドを書き直すことが解決策ですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。