这篇文章主要介绍了php中重写override的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
定义:重写(override),即子类中定义了与父类重名的成员,子类可以重写父类任意类成员,通常重写是用来重写父类的方法,用于扩展或者更改某些业务逻辑。
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
不能访问父类的属性,可以访问静态属性
、静态方法
、类常量
和普通方法
。
感谢你能够认真阅读完这篇文章,希望小编分享的“php中重写override的方法”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。