PHP重写的定义是什么,怎么应用
Admin 2022-08-20 群英技术资讯 418 次浏览
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
不能访问父类的属性,可以访问静态属性
、静态方法
、类常量
和普通方法
。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
Direct IO 其实是 Linux 操作系统中的一个概念,今天通过本文给大家介绍PHP中DirectIO直操作文件扩展的使用,需要的朋友参考下吧
传统PHP开发都是基于Web的,基本上都是HTTP协议,HTTP协议的解析处理都由WebServer独自承担了,所以开发者不会关心协议方面的事情。然而当我们需要基于非HTTP协议开发时,开发者就需要考虑协议的事情了。
这篇文章主要给大家介绍了关于如何利用PHP实现多张上传图片功能的,文中通过示例代码介绍的非常详细,对大家的学习PHP具有一定的帮助,需要的可以参考一下
在本篇文章里小编给大家分享了关于php语法检查的方法的知识点内容,有需要的朋友们学习下。
本文主要给大家分享的是关于laravel数据验证的内容,下文是小编整理的一些laravel数据验证规则,具有一定的参考借鉴价值,有这个方面学习需要的朋友可以参考学习。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008