當前位置:學者齋 >

計算機 >php語言 >

PHP面向物件程式設計之深入理解方法

PHP面向物件程式設計之深入理解方法

文章主要介紹了PHP面向物件程式設計之深入理解方法過載與方法覆蓋(多型)的相關資料,需要的朋友可以參考下

PHP面向物件程式設計之深入理解方法

  什麼是多型?

多型(Polymorphism)按字面的意思就是“多種狀態”。在面向物件語言中,介面的多種不同的實現方式即為多型。引用Charlie Calverts對多型的描述——多型性是允許你將父物件設定成為和一個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作(摘自“Delphi4程式設計技術內幕”)。簡單的說,就是一句話:允許將子類型別的指標賦值給父類型別的指標(沒錯這段話來自百度百科)。那麼多型的作用是什麼,它有什麼實際開發價值呢?在實際的應用開發中,採用面向物件中的多型主要在於可以將不同的子類物件都當作一個父類來處理,並且可以遮蔽不同子類物件之間所存在的差異,寫出通用的程式碼,做出通用的程式設計,以適應需求的不斷變化。

  下面就是PHP中多型的兩個實現

  方法過載(overload)

過載是類的多型的一種實現。函式過載指一個識別符號被用作多個函式名,且能夠通過函式的引數個數或引數型別將這些同名的函式區分開來,呼叫不發生混淆。即當呼叫的時候,雖然方法名字相同,但根據引數的不同可以自動呼叫相應的函式。

class A{

public function test(){

echo "test1";

}

public function test($a){

echo "test2";

}

}

$a=new A();

$a->test();

$a->test($a);

假如php直接支援方法過載的話。那麼上面的例子執行後傳參和不傳參就會返回不同的.值。然而php並不直接支援過載,這就意味著你如果直接按上面這樣定義的話,就會報錯的。會報什麼錯呢?會報如下的錯誤。

  這意思就是不能重複定義A函式,報錯的行數也正是下面這行。

  public function test($a){

所以說php是並不直接支援過載的。合著說了這麼半天php並不支援。。別急,我說的是並不直接支援,所以說是我們可以讓php間接支援。這時候就要用到一個函式來支援過載了。就是__call()。__call()方法必須帶有兩個引數。第一個包含了被呼叫的方法名稱,而第二個引數包含了傳遞給該方法的引數陣列。可以通過這個方法實現類似於函式過載的功能。看下面的程式碼。

public function __call($method,$p)

{

if($method=="display"){

if(is_object($p[0])){

$this->displayObject($p[0]);

}else if(is_array($p[0])){

$this->displayArray($p[0]);

}else{

$this->displayScalar($p[0]);

}

}

}

  //下面是對上面定義的呼叫

$ov=new overload;

$ov->display(array(1,2,3));

$ov->display('cat');

定義方法的時候,可以看到有三個分支,如果一個物件傳遞給display()方法,就呼叫的是displayObject()方法;如果傳遞的是一個數組,呼叫displayArray();傳遞的是其他的內容的話,則呼叫的是displayScalar()方法。。。可以看到下面呼叫時,第一個是傳遞了一個數組,則呼叫displayArray()。第二個傳入的不是物件也不是陣列,則屬於其他內容,呼叫的是displayScalar()方法。所以這樣子就用__call()方法實現了類似於其他語言的方法過載。

  方法覆蓋(override)

所謂覆蓋,從本質上來說就是重寫。就是當子類繼承父類的一些方法後,子類又在其內部定義了相同的方法,則這個新定義的方法會覆蓋繼承而來的父類的方法,子類只能呼叫其內部定義的方法。

  有以下幾點要求:

1.當一個父類和子類有一個方法,引數和名字完全一致,那麼子類方法會覆蓋父類的方法。

2.在實行方法覆蓋的時候,訪問修飾符可以是不一樣的,但是子類的訪問範圍必須大於等於父類的訪問範圍。

3.要求引數和名字一樣。並不是要求子類,父類名稱相同。

  下面是對這幾點的解釋:

第一點,必須引數一致,才會實現方法覆蓋。當引數個數不一致,則會報錯(這就牽扯到上面說所得方法過載)。當方法名字不一致,就不會覆蓋,只是子類新定義的方法。;

第二點,這是php這些語言設計時的規定吧。我是這麼理解的是訪問高一層的東西比較容易,如果再去訪問底層的東西許可權肯定要高一些。

看程式碼:

class people{

protected function sing(){

echo "人唱歌";

}

}

class woman extends people{

public function sing(){

echo "女人唱歌";

}

}

$woman1=new woman();

$woman1->sing();

  • 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-tw/jsj/php/pzgwvo.html