PHP5的物件模型 9 繫結

2021-08-21 22:53:15 字數 2379 閱讀 4746

第九節--繫結

除了限制訪問,訪問方式也決定哪個方法將被子類呼叫或哪個屬性將被子類訪問. 函式呼叫與函式本身的關聯,以及成員訪問與變數記憶體位址間的關係,稱為繫結.

在計算機語言中有兩種主要的繫結方式—靜態繫結和動態繫結. 靜態繫結發生於資料結構和資料結構間,程式執行之前. 靜態繫結發生於編譯期, 因此不能利用任何執行期的資訊. 它針對函式呼叫與函式的主體,或變數與記憶體中的區塊. 因為php是一種動態語言,它不使用靜態繫結. 但是可以模擬靜態繫結.

動態繫結則針對執行期產生的訪問請求,只用到執行期的可用資訊. 在物件導向的**中,動態繫結意味著決定哪個方法被呼叫或哪個屬性被訪問,將基於這個類本身而不基於訪問範圍.

public和protected成員的動作類似於php的前幾個版本中函式的動作,使用動態繫結. 這意味著如果乙個方法訪問乙個在子類中被覆寫的類成員,並是乙個子類的例項,子類的成員將被訪問(而不是訪問父類中的成員).

看例子6.10. 這段**輸出」 hey! i am son.」 因為當php呼叫getsalutation, 是乙個son的例項,是將father中的salutation覆寫而來. 如果salutation是public的,php將產生相同的結果. 覆寫方法的操作很類似.在son中,對於identify的呼叫繫結到那個方法.

即使在子類中訪問方式被從protected削弱成public, 動態繫結仍然會發生. 按照訪問方式使用的原則,增強對於類成員的訪問限制是不可能的. 所以把訪問方式從public改變成protected不可能進行.

listing 6.10 dynamic binding 動態繫結

<?php

class father

protected function identify()

}; class son extends father

}; $obj = new son();

$obj->getsalutation(); //輸出hey! i am son.

?>

//注: 在子類中沒有覆寫getsalutation(),但實際上仍然存在乙個getsalutation().這個類中的$salutation和identify()

//與son子類的例項中的getsalutation()方法動態繫結,所以呼叫son的例項的getsalutation()方法,

//將呼叫son類中的成員salutation及identify(),而不是父類中的成員salutation及identify().

private成員只存在於它們所在的類內部. 不像public和protected成員那樣,php模擬靜態繫結. 看例子6.11. 它輸出」hello there! i am father.」,儘管子類覆寫了salutation的值. 指令碼將this->salutation和當前類father繫結. 類似的原則應用於private方法identify().

listing 6.11 binding and private members

<?php

class father

private function identify() }

class son extends father }

$obj = new son();

$obj->getsalutation(); //輸出hello there! i am father.

?>

<?php

class user //使用者

public function getname() //獲得名字

public function deleteuser($username) //刪除使用者

//delete the user

print("user deleted.

n");

} }

class authorizeduser extends user //認證使用者 }

$user = new user;

$admin = new authorizeduser;

//not authorized

$user->deleteuser("zeev");

//authorized

$admin->deleteuser("zeev");

?>

為什麼private的類成員模擬靜態繫結? 為了回答這個問題, 你需要回憶一下為什麼需要有private成員.什麼時候用它們來代替protected成員是有意義的?

private成員只有當你不想讓子類繼承改變或特殊化父類的行為時才用到. 這種情況比你想像的要少. 通常來說,乙個好的物件分層結構應當允許絕大多數功能被子類特殊化,改進,或改變—這是物件導向程式設計的基礎之一. 一定的情況下需要private方法或變數,例如當你確信你不想允許子類改變父類中的某個特定的部份.

PHP5的物件模型 12 類的自動載入

第十二節 類的自動載入 當你嘗試使用乙個未定義的類時,php會報告乙個致命錯誤.解決方法就是新增乙個類,可以用include包含乙個檔案.畢竟你知道要用到哪個類.但是,php提供了類的自動載入功能,這可以節省程式設計的時間.當你嘗試使用乙個php沒有組織到的類,它會尋找乙個 autoload的全域性...

PHP5的物件模型 12 類的自動載入

第十二節 類的自動載入 當你嘗試使用乙個未定義的類時,php會報告乙個致命錯誤.解決方法就是新增乙個類,可以用include包含乙個檔案.畢竟你知道要用到哪個類.但是,php提供了類的自動載入功能,這可以節省程式設計的時間.當你嘗試使用乙個php沒有組織到的類,它會尋找乙個 autoload的全域性...

php5中的物件比較

1 當使用比較運算子 比較兩個物件變數時,比較的原則是 如果兩個物件的屬性和屬性值都相等,而且兩個物件是同乙個類的例項,那麼這兩個物件變數相等。2 而如果使用全等運算子 這兩個物件變數一定要指向某個類的同乙個例項 即同乙個物件 function bool2str bool else function...