/*
+-------------------------------------------- ----------------------------------+
| = 本文為Haohappy讀>
| = 中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」);
>
如果您對物件導向程式設計不熟悉,您可能想知道私人成員的目的為何。 您可以回想一下封裝和連結的想法,這首先是我們討論過的。 私人成員有助於封裝資料。 他們可以隱藏在一個類別內部而不被類別外部的程式碼接觸到。 同時它們也有助於實現鬆散的耦合。 如果資料結構外部的程式碼無法直接存取內部屬性,那麼就不會產生一個隱性的關聯性。
當然,大部分私有屬性仍然可以被外部程式碼共用。 解決方法是用一對public方法,一個是get(取得屬性的值),另一個是set(設定屬性的值)。 構造函數也接受屬性的初始值。 這使得成員間的交流透過一個嚴格的、經過良好限定的介面來進行。 這也提供了改變交付方法的價值的機會。 注意在範例6.8中,建構函數如何強制使價格成為浮點數(floadval())。
Protected(受保護的)成員能被同一個類別中的所有方法和繼承出的類別中的所有方法存取。 公共屬性有不允許封裝的精神,因為它們的子類別依賴一個特定的屬性來書寫。受保護的方法則不會引起這方面的擔憂。一個使用受保護方法的子類別需要很清楚它的父類別的結構才行。
example6.9由example6.8改良而得到,包含了一個Widget的子類別Thing。 注意Widget現在有一個名為getName的受保護方法。 如果 Widget 的實例嘗試呼叫受保護的方法將會出錯:$w1->getName() 會產生一個錯誤。 但子類別Thing中的getName方法可以呼叫這個受保護的方法。當然對於論證Widget::getName方法是受保護的,這個例子稍稍擴展。 在實際情況下,使用protected方法要依賴對物件的內部結構的理解。
清單 6.9 受保護的成員
複製程式碼
程式碼如下:
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
{
Š {
$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成員仍然只在當前類別中可見。 宣告一個與父類別的私有成員同名的成員將簡單地在目前類別中建立一個與原來不同的成員。 因此,在技術上你不能覆蓋寫一個私有成員。
最後一個關鍵字是限制存取成員方法的另一個方法。 子類別不能覆寫寫父類別中標識為最終的方法。 最終關鍵字不能用於屬性。
以上就介紹了二氧化錳和濃鹽酸方程式第八節--訪問方式,包括二氧化錳和濃鹽酸方程式方面的內容,希望對PHP教程有興趣的朋友有所幫助。