來源:互聯網
上載者:User
關鍵字
介紹
介面
index
config
function
A
在 PHP5 中多了一系列新介面。在 HaoHappy 翻譯的系列文章中 你可以瞭解到他們的應用。同時這些介面和一些實現的 Class 被歸為 Standard PHP Library(SPL)。在 PHP5 中加入了很多特性,使類的重載 (Overloading) 得到進一步的加強。ArrayAccess 的作用是使你的 Class 看起來像一個數組 (PHP的數組)。這點和 C# 的 Index 特性很相似。
下面是 ArrayAccess 的定義:
interface ArrayAccess
boolean offsetExists($index)
mixed offsetGet($index)
void offsetSet($index, $newvalue)
void offsetUnset($index)
由於PHP的數組的強大,很多人在寫 PHP 應用的時候經常將配置資訊儲存在一個數組裡。於是可能在代碼中到處都是 global。我們換種方式?
如以下代碼:
//Configuration Class class Configuration implements ArrayAccess { static private $config; private $configarray; private function __construct() { // init $this->configarray = array("Binzy"=>"Male", "Jasmin"=>"Female"); } public static function instance() { // if (self::$config == null) { self::$config = new Configuration(); } return self::$config; } function offsetExists($index) { return isset($this->configarray[$index]); } function offsetGet($index) { return $this->configarray[$index]; } function offsetSet($index, $newvalue) { $this->configarray[$index] = $newvalue; } function offsetUnset($index) { unset($this->configarray[$index]); } } $config = Configuration::instance(); print $config["Binzy"];
正如你所預料的,程式的輸出是"Male"。
如果我們做下面那樣的動作:
$config = Configuration::instance(); print $config["Binzy"]; $config['Jasmin'] = "Binzy's Lover"; // config 2 $config2 = Configuration::instance(); print $config2['Jasmin'];
是的,也正如預料的,輸出的將是Binzy's Lover。
也許你會問,這個和使用數組有什麼區別呢?目的是沒有區別的,但最大的區別在於封裝。OO 的最基本的工作就是封裝,而封裝能有效將變化置於內部。也就是說,當配置資訊不再儲存在一個 PHP 數組中的時候,是的,應用代碼無需任何改變。可能要做的,僅僅是為配置方案添加一個新的策略(Strategy)。:
ArrayAccess 在進一步完善中,因為現在是沒有辦法 count 的,雖然大多數情況並不影響我們的使用。
參考:
1. 《PHP5 Power Programming》
2. 《設計模式》
3. 《物件導向分析與設計》
您可以通過 binzywu at gmail dot com 與作者聯絡。