PHP重写的定义是什么,怎么应用
Admin 2022-08-20 群英技术资讯 456 次浏览
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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
swoole使用两种模式运行。单线程模式,这种模式就是传统的异步非阻塞Server。与Nginx和Node.js等程序是完全一致的。进程模式,Swoole提供了完善的进程管理、内存保护机制。 在业务逻辑非常复杂的情况下,也可以长期稳定运行。
今天小编就为大家分享一篇laravel 判断查询数据库返回值的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
建立一个websocket Worker,用来维持客户端长连接;在websocket Worker内部建立一个text Worker;开启一个内部端口,方便内部系统推送数据;通过workerman,向uid的页面推送数据;返回推送结果。
在PHP7之后,PHP中加入了匿名类的特性。匿名类和匿名方法让PHP成为了更现代化的语言,也让我们的代码开发工作越来越方便。下面本篇文章就来简单带大家了解一下PHP7 匿名类的用法,希望对大家有所帮助!
PHP7教程栏目介绍总结PHP7语言基础,干货满满,总结的基础知识全在这里,有需要的朋友可以点赞收藏。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008