首頁 > 後端開發 > php教程 > 第八節--訪問方式_PHP教程

第八節--訪問方式_PHP教程

WBOY
發布: 2016-07-21 16:01:02
原創
857 人瀏覽過

/*
--------------------------------------------- ----------------------------------
| = 本文為Haohappy讀>
| = 中Classes and Objects一章的筆記 
| = 翻譯為主要在Classes and Objects一章中的筆記 
| = 翻譯為主個人心得 
| = 為避免可能發生的不必要的麻煩 》批評、謝謝,希望與所有PHP愛好者共同進步! 
| = PHP5研究中心: http://blog.csdn.net/haohappy2004
----------------- -------------------------------------------------- ------------
*/
第八節--存取方式
PHP5的存取方式允許限制對類別成員的存取. 這是在PHP5中新增的功能,但在許多物件導向語言中都早已存在. 有了存取方式,才能開發一個可靠的物件導向應用程式,並且建立可重複使用的物件導向類別庫.
像C 和Java一樣,PHP有三種存取方式:public,private和protected. 對於一個類別成員的存取方式,可以是其中之一. 如果你沒有指明存取方式,預設地存取方式為public. 你也可以為靜態成員指明一種存取方式,將存取方式放在static關鍵字之前(如public static).
Public成員可以被毫無限制地存取.類別外部的任何程式碼都可以讀寫public屬性. 你可以從腳本的任何地方呼叫一個public方法. 在PHP的前幾個版本中,所有方法和屬性都是public, 這讓人覺得對象就像是結構精巧的數組.
Private(私有)成員只在類的內部可見. 你不能在一個private屬性所在的類別方法之外改變或讀取它的值. 同樣地,只有在同一個類別中的方法可以呼叫一個private方法. 繼承的子類別也不能存取父類別中的private 成員.
要注意,類別中的任何成員和類別的實例都可以存取private成員. 看例子6.8,equals方法將兩個widget進行比較.==運算子比較同一個類別的兩個物件,但這個例子每個物件實例都有唯一的ID.equals方法只比較name和price. 注意equals方法如何存取另一個Widget實例的private屬性. Java和C都允許這樣的操作.
Listing 6.8 Private members

複製程式碼 程式碼如下:
   class Widget  
   {  
            私人$id;  
       公共函數 __construct($name, $price)  
       {  
           $this->name = $name;              $this->id = uniqid();  
       }  
//檢查兩個小部件是否相同,檢查兩個小部件是否相同  
       public function equals($widget)  
     widget->名稱) AND  
               ($this->價格 == $widget->價格));      $w2 = new Widget('Cog', 5.00);  
   $w3 = new Widget('Gear', 7.00);  
   //TRUE {  
       print("w1 且w2 相同
n");  
   }  
   //FALSE  }  
   //FALSE  }  
   //FALSE  }     {  
print("w1 和w3 相同
n");  
   }  
   //FALSE, == 在比較中包含id    ID 不同  
   {  
       print("w1 與 w2是相同的
n」);  
  >  
如果你對物件導向程式設計不熟悉,你可能想知道用private成員的目的是什麼. 你可以回憶一下封裝和耦合的想法,這在本章開頭我們有討論過. Private成員有助於封裝資料. 他們可以隱藏在一個類別內部而不被類別外部的程式碼接觸到. 同時他們還有助於實現鬆散的耦合. 如果資料結構外的程式碼不能直接存取內部屬性,那麼就不會產生一個隱性的關聯性.
當然,大部分private屬性仍然可以被外部程式碼共用. 解決方法是用一對public方法,一個是get(取得屬性的值),另一個是set(設定屬性的值). 建構子也接受屬性的初始值. 這使得成員間的交流通過一個狹窄的,經過良好限定的接口來進行. 這也提供改變傳遞給方法的值的機會. 注意在例子6.8中,構造函數如何強制使price成為一個float數(floadval()).
Protected(受保護的) 成員能被同一個類別中的所有方法和繼承出的類別的中所有方法存取到. Public屬性有違封裝的精神,因為它們允許子類別依賴一個特定的屬性來書寫.protected方法則不會帶來這方面的擔憂.一個使用protected方法的子類別需要很清楚它的父類別的結構才行.
範例6.9由範例6.8改進而得到,包含了一個Widget的子類別Thing. 注意Widget現在有一個叫作getName的protected方法. 如果Widget的實例試圖調用protected方法將會出錯: $w1->getName()產生了錯誤. 但子類別Thing中的getName方法可以呼叫這個protected方法.當然對於證明Widget::getName方法是protected,這個例子顯得過於簡單. 在實際情況下,使用protected方法要依賴於對對象的內部結構的理解.
Listing 6.9 Protected members 
複製程式碼 程式碼如下:
   class Widget  
   {  
            私人$id;  
       公共函數 __construct($name, $price)  
       {  
           $this->name = $name;              $this->id = uniqid();  
       }  
//檢查兩個小工具是否相同  
       public function equals($widget)  
       get->姓名)AND  
               ($this ->price == $widget->price));  
       }  
               return($this->name);  
       }  
}  
   類Thing 擴充 Widget  
   {  
       private       {  
           $this->color = $color;  
    🎜>       公用函數getColor()  
       {  
       
       公用函數getName()  
       {  
       );  
       }  
   }  
   $w1 = new Widget('Cog',   $w1 = new Widget('Cog', 5.00), 5. .00);  
   $w2->setColor ('黃色');  
   //TRUE (仍為! ) 結果仍為真  
   if($w1->equals($w2))  
   {  
       
//print Cog 輸出 Cog  
   print($w2->getName());  
? > 

一個子類別可能改變透過覆寫父類別方法來改變方法的存取方式,儘管如此,仍然有一些限制. 如果你覆寫了一個public類別成員,他子類別中必須保持public. 如果你覆寫了一個protected成員,它可保持protected或變成public.Private成員仍然只在當前類中可見. 聲明一個與父類的private成員同名的成員將簡單地在當前類中建立一個與原來不同的成員. 因此,在技術上你不能覆蓋一個private成員. 
Final關鍵字是限制訪問成員方法的另一個方法. 子類不能覆蓋父類中標識為final的方法. Final關鍵字不能用於屬性.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/316944.htmlTechArticle/* ---------------------- -------------------------------------------------- ------- |=本文為Haohappy讀CorePHPProgramming |=中ClassesandObjects一章的筆記|=翻譯為主個人...
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板