温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

php中重写override的方法

发布时间:2021-03-04 09:29:46 来源:亿速云 阅读:103 作者:小新 栏目:编程语言

这篇文章主要介绍了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的方法”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI