首頁 > 後端開發 > PHP7 > 如果還有一次機會,重寫override就是你的出路

如果還有一次機會,重寫override就是你的出路

autoload
發布: 2023-02-17 20:16:02
原創
1925 人瀏覽過

  定義:重寫(override),也就是子類別中定義了與父類別重名的成員,子類別可以重寫父類別任意類別成員,通常重寫是用來重寫父類別的方法,用於擴展或更改某些業務邏輯。

  1.不管是公有屬性,還是受保護屬性,一旦重寫父類別的屬性就會不存在,而私有屬性不會因為被覆寫而遺失。

<?php
    class A{
      
        public $name=&#39;张三&#39;;
        protected $sex=&#39;man&#39;;
        private  $age=&#39;25&#39;;

        public function getName(){
           echo __CLASS__,&#39;<br/>&#39;;
           echo $this->name."<br>";
        }
        protected function getSex(){
            echo __CLASS__,&#39;<br/>&#39;;
            echo $this->sex."<br>";
        }
        private function getAge(){
            echo __CLASS__,&#39;<br/>&#39;;
            echo $this->age."<br>";
        }

    }
    class B extends A{
        
        public $name=&#39;王五&#39;;
        protected $sex=&#39;woman&#39;;
        private  $age=&#39;26&#39;;
    
        
        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=&#39;张三&#39;;
        protected $sex=&#39;man&#39;;
        private  $age=&#39;25&#39;;

        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=&#39;王五&#39;;
        protected $sex=&#39;woman&#39;;
        private  $age=&#39;26&#39;;

        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__,&#39;<br/>&#39;;
    }
}
class Zi extends Fu{
    protected function show(){}				//正确
    public function show(){}				//允许
    private function show(){}				//错误:控制权比父类更严格
}
?>
登入後複製

    b. PHP中重寫要求子類別重寫父類別方法的時候,必須確保與父類別同名方法參數一致。

<?php
class Fu{
    protected function show(){
        echo __CLASS__,&#39;<br/>&#39;;
    }
}
class Zi extends Fu{
    public function show(){}
    public function show($a){}			//错误,与父类同名方法不一致
}
?>
登入後複製

    c. 重寫針對的是繼承的成員,父類別私有方法不會被繼承,因此不受要求b規定。

<?php
class Fu{
    private function show(){
        echo __CLASS__,&#39;<br/>&#39;;
    }
}
class Zi extends Fu{
    private function show($name){		//不会报错,因为本质不存在重写(父类Fu::show没有被继承)
        echo $name,&#39;<br/>&#39;;
    }
}
?>
登入後複製

    d.重寫是指子類別擁有特殊的情況,一般是需要在父類別的基礎上進行擴展,此時如果想要繼續保證父類別被重寫的方法繼續執行(預設永遠只存取子類別重寫的新方法),需要在子類別重寫方法的時候使用parent關鍵字。

<?php
class Fu{
    protected function show(){
        echo __CLASS__,&#39;<br/>&#39;;
    }
}
class Zi extends Fu{
    public function show(){
        parent::show();
        
        //扩展业务逻辑
        echo __CLASS__,&#39;<br/>&#39;;
    }
}?>
登入後複製

  小結:parent無法存取父類別的屬性,可以存取靜態屬性靜態方法類別常數普通方法

推薦:php教學,php影片教學

以上是如果還有一次機會,重寫override就是你的出路的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板