程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> ArrayAccess接口介紹

ArrayAccess接口介紹

編輯:關於PHP編程

在 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. 《面向對象分析與設計》

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved