第九節(jié)--綁定 <?php class Father { protected $salutation = "Hello there!"; //問候 public function getSalutation() { print("$this->salutation\n"); $this->identify(); } protected function identify() { print("I am Father.<br>\n"); } }; class Son extends Father { protected $salutation = "Hey!"; //父類中的protected $salutation 被覆寫 protected function identify() //父類中的protected identify() 被覆寫 { print("I am Son.<br>\n"); } }; $obj = new Son(); $obj->getSalutation(); //輸出Hey! I am Son. ?> //注: 在子類中沒有覆寫getSalutation(),但實際上仍然存在一個getSalutation().這個類中的$salutation和identify() //與Son子類的實例中的getSalutation()方法動態(tài)綁定,所以調(diào)用Son的實例的getSalutation()方法, //將調(diào)用Son類中的成員salutation及identify(),而不是父類中的成員salutation及identify(). Private成員只存在于它們所在的類內(nèi)部. 不像public和protected成員那樣,PHP模擬靜態(tài)綁定. 看例子6.11. 它輸出”Hello there! I am Father.”,盡管子類覆寫了salutation的值. 腳本將this->salutation和當前類Father綁定. 類似的原則應(yīng)用于private方法identify(). Listing 6.11 Binding and private members <?php class Father { private $salutation = "Hello there!"; public function getSalutation() { print("$this->salutation\n"); $this->identify(); } private function identify() { print("I am Father.<br>\n"); } } class Son extends Father { private $salutation = "Hey!"; private function identify() { print("I am Son.<br>\n"); } } $obj = new Son(); $obj->getSalutation(); //輸出Hello there! I am Father. ?> 動態(tài)綁定的好處是允許繼承類來改變父類的行為,同時可以保持父類的接口和功能. 看例子6.12. 由于使用了動態(tài)綁定,在deleteUser中被調(diào)用的isAuthorized的version 可以由對象的類型來確定. 如果是一個普通的user,PHP調(diào)用User::isAuthorized會返回FALSE.如果是一個AuthorizedUser的實例,PHP調(diào)用AuthorizedUser::isAuthorized,將允許deleteUser順利執(zhí)行. //haohappy注:用一句話說清楚,就是對象類型與方法,屬性綁定. 調(diào)用一個父類與子類中都存在的方法或訪問一個屬性時,會先判斷實例屬于哪種對象類型,再調(diào)用相應(yīng)的類中的方法和屬性. Listing 6.12 動態(tài)綁定的好處 <?php class User //用戶 { protected function isAuthorized() //是否是驗證用戶 { return(FALSE); } public function getName() //獲得名字 { return($this->name); } public function deleteUser($username) //刪除用戶 { if(!$this->isAuthorized()) { print("You are not authorized.<br>\n"); return(FALSE); } //delete the user print("User deleted.<br>\n"); } } class AuthorizedUser extends User //認證用戶 { protected function isAuthorized() //覆寫isAuthorized() { return(TRUE); } } $user = new User; $admin = new AuthorizedUser; //not authorized $user->deleteUser("Zeev"); //authorized $admin->deleteUser("Zeev"); ?> 為什么private的類成員模擬靜態(tài)綁定? 為了回答這個問題, 你需要回憶一下為什么需要有private成員.什么時候用它們來代替protected成員是有意義的? private成員只有當你不想讓子類繼承改變或特殊化父類的行為時才用到. 這種情況比你想像的要少. 通常來說,一個好的對象分層結(jié)構(gòu)應(yīng)當允許絕大多數(shù)功能被子類特殊化,改進,或改變—這是面向?qū)ο缶幊痰幕A(chǔ)之一. 一定的情況下需要private方法或變量,例如當你確信你不想允許子類改變父類中的某個特定的部份. |
溫馨提示:喜歡本站的話,請收藏一下本站!