如果还有一次机会,重写override便是你的出路

广告:宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取~~~

如果还有一次机会,重写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. 子类重写父类的方法,控制权不能高于父类,即子类可以比父类更开放。

<?phpclass Fu{    protected function show(){        echo __CLASS__,'<br/>';    }}class Zi extends Fu{    protected function show(){}//正确    public function show(){}//允许    private function show(){}//错误:控制权比父类更严格}?>
登录后复制

b. PHP中重写要求子类重写父类方法的时候,必须保证与父类同名方法参数一致。

<?phpclass Fu{    protected function show(){        echo __CLASS__,'<br/>';    }}class Zi extends Fu{    public function show(){}    public function show($a){}//错误,与父类同名方法不一致}?>
登录后复制

c. 重写针对的是被继承的成员,父类私有方法不会被继承,因此不受要求b规定。

<?phpclass Fu{    private function show(){        echo __CLASS__,'<br/>';    }}class Zi extends Fu{    private function show($name){//不会报错,因为本质不存在重写(父类Fu::show没有被继承)        echo $name,'<br/>';    }}?>
登录后复制

d.重写是指子类拥有特殊的情况,一般是需要在父类的基础上进行扩展,此时如果想要继续保证父类被重写的方法继续执行(默认永远只访问子类重写的新方法),需要在子类重写方法的时候使用parent关键字。

<?phpclass Fu{    protected function show(){        echo __CLASS__,'<br/>';    }}class Zi extends Fu{    public function show(){        parent::show();                //扩展业务逻辑        echo __CLASS__,'<br/>';    }}?>
登录后复制

小结:parent不能访问父类的属性,可以访问静态属性静态方法类常量普通方法

推荐:php教程,php视频教程

以上就是如果还有一次机会,重写override便是你的出路的详细内容,更多请关注9543建站博客其它相关文章!

9543建站博客
一个专注于网站开发、微信开发的技术类纯净博客。
作者头像
admin创始人

肥猫,知名SEO博客站长,14年SEO经验。

上一篇:如何禁用手机浏览器javascript
下一篇:如何在 Laravel 模型查询中排除不想要的字段

发表评论

关闭广告
关闭广告