面向?qū)ο缶幊倘筇匦?/h2>

三大特征

  • 封裝
  • 繼承
  • 多態(tài)

封裝性

  • 封裝就是把抽象出的數(shù)據(jù)和對(duì)數(shù)據(jù)的操作封裝在一起,數(shù)據(jù)被保護(hù)在內(nèi)部,程序的其他部門只有通過(guò)被授權(quán)的操作(成員方法),才能對(duì)數(shù)據(jù)進(jìn)行操作。

  • 訪問(wèn)修飾符

    • 訪問(wèn)修飾符既可以修飾方法,也可以修飾屬性
    • public:表示全局,類內(nèi)部、外部和子類都可以訪問(wèn);
    • protected:表示受保護(hù)的,只有本類或子類可以訪問(wèn);
    • private:表示私有的,只有本類內(nèi)部可以使用。
    //關(guān)于封裝
    class Person{
        public $name;
        protected $age;
        private $salary;
        function __construct($name,$age,$salary){
            $this->name=$name;
            $this->age=$age;
            $this->salary=$salary;
        }
        function showInfo(){
            echo $this->name."||".$this->age."||".$this->salary;
        }
        //通過(guò)一個(gè)方法訪問(wèn)protected或者private變量
        public function getSalary($name,$pass){
            if($name=="lyangye" && $pass==12345){
            return $this->salary;
            }else {
                echo "滾蛋,嘻嘻嘻";
            }
        }
        //修改年齡
        public function setAge($age){
            if($age>1 && $age<120){
            $this->age=$age;
            }else {
                echo "你的年齡范圍不對(duì)";
            }
        }
        //查看年齡
        public function getAge(){
            return $this->age;
        }
    }
    $p1=new Person("孫悟空",30,10000);
    echo $p1->name."<br />";
    echo $p1->getSalary("lyangye",12345);
    $p1->setAge(-23);
    echo "<br />".$p1->getAge();
    
    
  • 訪問(wèn)控制修飾符

    • 如果想要訪問(wèn)private和protected變量,通常的做法是提供public函數(shù)去訪問(wèn)這些變量;
    • 方法直接可以互相調(diào)用,但是需要使用$this引用
        function test1(){
            $this->test2();
        }
        private function test2(){
            echo "test2";
        }

繼承性

  • 所謂繼承就是一個(gè)子類 通過(guò)extends 父類,把父類的一些()public\protected)屬性和(public\protected)方法繼承下來(lái);

  • 繼承的基本語(yǔ)法是:

    • class 類名 extends 父類名(
      //寫自己需要的屬性和方法
      )
  • 一些細(xì)節(jié):

    • 繼承可以解決代碼復(fù)用,讓我們的編程更加靠近人類思維。

    • 父類的public\protected的屬性和方法被繼承,private的屬性和方法沒(méi)有被繼承;

    • 直接繼承的情況下,子類最多只能繼承一個(gè)父類;

      • 但是可以通過(guò)錯(cuò)層繼承的方法來(lái)繼承多個(gè)類;

    class A{
    protected $n1=90;
    }
    class B extends A{
    function show(){
    echo $this->n1;
    }
    public $n2="hello";

    }
    class C extends B{

    }
    $c=new C();
    echo $c->show();
    echo $c->n2;
    ```

    - 顯示效果:![](http://upload-images.jianshu.io/upload_images/4167376-d70094d759e653d9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    • 在創(chuàng)建某個(gè)子類對(duì)象時(shí),默認(rèn)情況下不會(huì)自動(dòng)調(diào)用其父類的構(gòu)造函數(shù);

        class A{
            public $n1=90;
            public function __construct(){
                echo "A __construct";
            }
        }
        class B extends A{
            function __construct(){
                echo "B __construct";
            }
        }
        $b=new B();
      
    • 顯示效果:
      默認(rèn)情況下,沒(méi)法繼承父類構(gòu)造函數(shù)
    • 如果想要調(diào)用父類的構(gòu)造方法或者其他方法(puiblic\protected)的方法

      • 方法1:類名::方法名();
      • 方法2:parent::方法名();
        class A{
            public $n1=90;
            public function __construct(){
                echo "A __construct<br/>";
            }
        }
        class B extends A{
            function __construct(){
                echo "B __construct<br/>";
                //顯式的調(diào)用
                A::__construct();
                parent::__construct();
            }
        }
        $b=new B();
    
      - 顯示效果:![](http://upload-images.jianshu.io/upload_images/4167376-3b07b5d2c00cd0f8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    • 當(dāng)一個(gè)子類的方法和父類的方法完全一樣,成為方法的重寫;

    • 子類可以繼承其父類的public,protected修飾的變量(屬性)和函數(shù)(方法);

方法重載

  • 基本概念:函數(shù)名一樣,通過(guò)函數(shù)的參數(shù)個(gè)數(shù)或者參數(shù)類型不同,達(dá)到調(diào)用同一個(gè)函數(shù)名,但是可以區(qū)分不同的函數(shù)。
  • "重載"是類的多態(tài)的一種實(shí)現(xiàn);
  • 函數(shù)重載指一個(gè)標(biāo)識(shí)符被用作多個(gè)函數(shù)名,且能夠通過(guò)函數(shù)的參數(shù)個(gè)數(shù)或參數(shù)類型將這些同名的函數(shù)區(qū)分開(kāi)來(lái),調(diào)用不發(fā)生混淆。
  • PHP5默認(rèn)情況下,不直接支持方法重載;
  • PHP5中可以通過(guò)__call魔術(shù)方法,模擬一個(gè)方法重載的效果;
    class A {
        public function test1($n){
            echo "接受一個(gè)參數(shù)<br/>";
            echo "接收到參數(shù)的是:";
            var_dump($n);
        }
        public function test2($n){
            echo "<br/>接受兩個(gè)參數(shù)<br/>";
            echo "接收到參數(shù)的是:";
            var_dump($n);
        }
        //__call是當(dāng)一個(gè)對(duì)象調(diào)用某個(gè)方法,而該方法不存在,則系統(tǒng)回自動(dòng)調(diào)用__call
        function __call($method,$n){
            if($method=="test"){
                if(count($n)==1){
                    $this->test1($n);
                }else if(count($n)==2){
                    $this->test2($n);
                }
            }
        }
    }
    $a=new A();
    $a->test(1);
    $a->test(22,33);

方法的重寫/方法的覆蓋(override)

  • 當(dāng)一個(gè)父類知道所有的子類都有一個(gè)方法,但是父類不能確定該方法如何寫,則可以讓子類進(jìn)行方法的覆蓋;
    //抽象一個(gè)Animal類
    class Animal{
        public $name="lhpoicq";
        protected $price;
        function aoaoao(){
            echo "不知道怎么叫";
        }
    }
    class dog extends Animal {
        function aoaoa(){
            echo "汪汪汪";
        }
    }
    class pig extends Animal {
        function aoaoao(){
            echo "XXX";
        }
    }
    $dog1=new dog();
    echo $dog1->name; 
    $pig1=new pig();
    $pig1->aoaoao();
  • 輸出效果:
  • 細(xì)節(jié)
    • 要實(shí)現(xiàn)重寫,需要子類的方法和參數(shù)列表一摸一樣;
    • 如果子類要去調(diào)用父類的方法(public\protected)則可以使用parent::方法名(參數(shù)),父類名::方法名(參數(shù));
    • 子類的方法的參數(shù)個(gè)數(shù),方法名稱,都要和父類方法的參數(shù)個(gè)數(shù),方法名稱一樣;
    • 子類方法不能縮小父類方法的訪問(wèn)權(quán)限。
        //子類方法不能縮小父類方法的訪問(wèn)權(quán)限
        class Animal {
            public function cry(){
                echo "動(dòng)物交換..";
            }
        }
        class Cat extends Animal {
            protected function cry(){
                echo "小貓喵喵喵";
                Animal::cry();
            }
        }
        $cat1=new Cat();
    
      - 顯示效果:![](http://upload-images.jianshu.io/upload_images/4167376-e2bf33fea52f759b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    

多態(tài)的體現(xiàn)

    class Animal{
        protected function cry($name){
            echo "動(dòng)物叫喚...".$name;
        }
    }
    class Cat extends Animal{
        public function cry($val){
            echo "貓貓叫喚...".$val; 
            //Animal::cry($val);
        }
    }
    $cat1=new Cat();
    $cat1->cry("hello");
  • 當(dāng)子類沒(méi)有覆蓋父類的方法,則$cat1->cry()調(diào)用的是父類的方法,當(dāng)子類覆蓋了父類的方法,則調(diào)用自己的cry()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容