作者:Leon Atkinson 翻譯:Haohappy PHP5的訪問方式允許限制對類成員的訪問. 這是在PHP5中新增的功能,但在許多面向?qū)ο笳Z言中都早已存在. 有了訪問方式,才能開發(fā)一個(gè)可靠的面向?qū)ο髴?yīng)用程序,并且構(gòu)建可重用的面向?qū)ο箢悗?
像C++和Java一樣,PHP有三種訪問方式:public,private和protected. 對于一個(gè)類成員的訪問方式,可以是其中之一. 如果你沒有指明訪問方式,默認(rèn)地訪問方式為public. 你也可以為靜態(tài)成員指明一種訪問方式,將訪問方式放在static關(guān)鍵字之前(如public static).
Public成員可以被毫無限制地訪問.類外部的任何代碼都可以讀寫public屬性. 你可以從腳本的任何地方調(diào)用一個(gè)public方法. 在PHP的前幾個(gè)版本中,所有方法和屬性都是public, 這讓人覺得對象就像是結(jié)構(gòu)精巧的數(shù)組.
Private(私有)成員只在類的內(nèi)部可見. 你不能在一個(gè)private屬性所在的類方法之外改變或讀取它的值. 同樣地,只有在同一個(gè)類中的方法可以調(diào)用一個(gè)private方法. 繼承的子類也不能訪問父類中的private 成員.
要注意,類中的任何成員和類的實(shí)例都可以訪問private成員. 看例子6.8,equals方法將兩個(gè)widget進(jìn)行比較.==運(yùn)算符比較同一個(gè)類的兩個(gè)對象,但這個(gè)例子中每個(gè)對象實(shí)例都有唯一的ID.equals 方法只比較name和price. 注意equals方法如何訪問另一個(gè)Widget實(shí)例的private屬性. Java和C都允許這樣的操作.
Listing 6.8 Private members
<?php class Widget { private $name; private $price; private $id;
public function __construct($name, $price) { $this->name = $name; $this->price = floatval($price); $this->id = uniqid(); } //checks if two widgets are the same 檢查兩個(gè)widget是否相同 public function equals($widget) { return(($this->name == $widget->name)AND ($this->price == $widget->price)); } } $w1 = new Widget('Cog', 5.00); $w2 = new Widget('Cog', 5.00); $w3 = new Widget('Gear', 7.00);
//TRUE if($w1->equals($w2)) { print("w1 and w2 are the same<br>n"); }
//FALSE if($w1->equals($w3)) { print("w1 and w3 are the same<br>n"); }
//FALSE, == includes id in comparison if($w1 == $w2) file://不等,因?yàn)镮D不同 { print("w1 and w2 are the same<br>n"); } ?>
一個(gè)子類可能改變通過覆寫父類方法來改變方法的訪問方式,盡管如此,仍然有一些限制. 如果你覆寫了一個(gè)public類成員,他子類中必須保持public. 如果你覆寫了一個(gè)protected成員,它可保持protected或變成public.Private成員仍然只在當(dāng)前類中可見. 聲明一個(gè)與父類的private成員同名的成員將簡單地在當(dāng)前類中建立一個(gè)與原來不同的成員. 因此,在技術(shù)上你不能覆寫一個(gè)private成員.
Final關(guān)鍵字是限制訪問成員方法的另一個(gè)方法. 子類不能覆寫父類中標(biāo)識為final的方法. Final關(guān)鍵字不能用于屬性.
//haohappy注:PHP5的面向?qū)ο竽P腿匀徊粔蛲晟?如final不像Java中那樣對Data,Method甚至Class都可以用。
超越PHP(www.phpe.org) 及Haohappy特別授權(quán)藍(lán)色理想轉(zhuǎn)載本系列文章,謝絕其它媒體任何形式轉(zhuǎn)載。
出處:超越PHP
責(zé)任編輯:cjj
上一頁 第七節(jié) 類的靜態(tài)成員 [7] 下一頁 第九節(jié) 綁定 [9]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|