第九節--繫結
除了限制訪問,訪問方式也決定哪個方法將被子類呼叫或哪個屬性將被子類訪問. 函式呼叫與函式本身的關聯,以及成員訪問與變數記憶體位址間的關係,稱為繫結.
在計算機語言中有兩種主要的繫結方式—靜態繫結和動態繫結. 靜態繫結發生於資料結構和資料結構間,程式執行之前. 靜態繫結發生於編譯期, 因此不能利用任何執行期的資訊. 它針對函式呼叫與函式的主體,或變數與記憶體中的區塊. 因為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...