天天看點

一文搞懂PHP中面向對象的三大特征

面向對象三大特征

很多資料說面向對象有三條特征是封裝,繼承多态。

但是抽象也是面向對象中的一個特征。

抽象

去定義一個類時候,實際上就是把一類事物的共有的屬性和行為提取出來,形成一個實體模型(模闆)。這種研究問題的方法稱為抽象。

封裝

封裝就是把抽象出的資料和對資料的操作封裝在一起,資料被保護在内部,程式的其它部分隻有通過被授權的操作(成員方法),才能對資料進行操作。

繼承

繼承可以解決代碼複用,當多個類存在相同的屬性(變量)和方法時,可以從這些類中抽象出父類,在父類中定義這些相同的屬性和方法,所有的子類不需要重新定義這些屬性和方法,隻需要通過

class 子類名 extends 父類名{
}
           

這樣,子類就會自動擁有父類定義的屬性和方法。

多态

函數名一樣,通過函數的參數個數或者是參數類型不同,達到調用同一個函數名,但是可以區分不同的函數。

傳統的重載

class  A{

	public function test1(){
	echo “test1”;
}
public function test1($a){
	echo “test1 hello”;
}
}
$a =new A();
**沒有傳入參數則調用test1(){}
$a->test1();
**傳入參數則調用test1($a){}
$a->test1(456);

           

上面這種寫法在php中會報錯。PHP是弱類型語言,是以PHP不支援多态。但是PHP有自己的重載方法來模拟多态。

PHP中的“重載”與其它絕大多數面向對象語言不同。傳統的“重載”是用于提供多個同名的類方法,但各方法的參數類型和個數不同。

使用魔術方法__call

__call 是它一個對象調用某個方法,而該方法不存在,則系統會自動調用__call

<?php

class  A{

    public function test1($p){
        echo "接收一個參數<br/>";

    }
    public function test2($p){
        echo "接收兩個參數<br/>";

    }


    //這些提供一個__call
    //__call 是它一個對象調用某個方法,而該方法不存在,則
    //系統會自動調用__call
    function __call($method,$p){
        var_dump($p);
        if($method=="test"){
            if(count($p)==1){
                $this->test1($p);
            }else if(count($p)==2){
                $this->test2($p);
            }
        }
    }

}

$a=new A();
$a->test(1); //結果:接收一個參數

$a->test(56,90);//結果:接收二個參數

?>

           

關于屬性的重載php也有自身的方法來實作。

php重載