• 技术文章 >后端开发 >PHP7

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

    逆旅行人逆旅行人2021-03-09 13:53:39原创403
    定义:重写(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教程,php视频教程

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

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:php override 重写
    上一篇:讲解Centos安装PHP7及配置php-fpm开机启动 下一篇:php7安装卸载的方法
    大前端线上培训班

    相关文章推荐

    • PHP和JAVA中的重载(overload)和覆盖(override) 介绍_php技巧• PHP和JAVA中的重载(overload)和覆盖(override) 介绍_PHP• PHP和JAVA中的重载(overload)和覆盖(override) 介绍_PHP教程• PHP中overload与override的区别

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网