在php中提供了許多接口用於實現一些很特定的功能比如你想把一個對象當作array使用時只需要實現ArrayAccess接口當你想要foreach中能夠使用一個對象時只需要實現Iterator接口下面給一個例子出來
class BtstoreRoot
{
/**
* 根結點
* @var BtstoreElement
*/
static $root;
}
class BtstoreElement implements ArrayAccess Iterator
{
/**
* 當前所代表的目錄
* @var string
*/
private $dataDir;
/**
* 當前所代表的數據
* @var array
*/
private $arrData;
/**
* 構造函數
* @param string $dataDir
* @param array $arrData
*/
function __construct($dataDir $arrData)
{
$this>dataDir = ;
$this>arrData = array ();
if (! empty ( $dataDir ) && is_dir ( $dataDir ))
{
$this>dataDir = $dataDir;
}
if (! empty ( $arrData ))
{
$this>arrData = $arrData;
}
}
function __get($key)
{
if (isset ( $this>arrData [$key] ))
{
$data = $this>arrData [$key];
if (is_array ( $data ) && ! is_object ( $data ))
{
$data = new BtstoreElement ( $data );
}
return $data;
}
if (! empty ( $this>dataDir ))
{
$path = $this>dataDir / $key;
if (is_dir ( $path ))
{
$data = new BtstoreElement ( $path null );
$this>arrData [$key] = $data;
return $data;
}
if (is_file ( $path ))
{
$content = file_get_contents ( $path );
$arrData = unserialize ( $content );
$data = new BtstoreElement ( $arrData );
$this>arrData [$key] = $data;
return $data;
}
}
trigger_error ( "undefined index:$key" );
}
function __isset($key)
{
if (isset ( $this>arrData [$key] ))
{
return true;
}
if (file_exists ( $this>dataDir / $key ))
{
return true;
}
return false;
}
function toArray()
{
return $this>arrData;
}
/* (nonPHPdoc)
* @see ArrayAccess::offsetExists()
*/
public function offsetExists($offset)
{
return $this>__isset ( $offset );
}
/* (nonPHPdoc)
* @see ArrayAccess::offsetGet()
*/
public function offsetGet($offset)
{
return $this>__get ( $offset );
}
/* (nonPHPdoc)
* @see ArrayAccess::offsetSet()
*/
public function offsetSet($offset $value)
{
trigger_error ( offsetSet not implemented by BtstoreElement );
}
/* (nonPHPdoc)
* @see ArrayAccess::offsetUnset()
*/
public function offsetUnset($offset)
{
trigger_error ( offsetUnset not implemented by BtstoreElement );
}
/* (nonPHPdoc)
* @see Iterator::current()
*/
public function current()
{
return current ( $this>arrData );
}
/* (nonPHPdoc)
* @see Iterator::next()
*/
public function next()
{
return next ( $this>arrData );
}
/* (nonPHPdoc)
* @see Iterator::key()
*/
public function key()
{
return key ( $this>arrData );
}
/* (nonPHPdoc)
* @see Iterator::valid()
*/
public function valid()
{
$data = current ( $this>arrData );
return ! empty ( $data );
}
/* (nonPHPdoc)
* @see Iterator::rewind()
*/
public function rewind()
{
reset ( $this>arrData );
}
}
/**
* 獲取一個BtstoreElement對象
* @return BtstoreElement
*/
function btstore_get()
{
if (empty ( BtstoreRoot::$root ))
{
BtstoreRoot::$root = new BtstoreElement ( ScriptConf::BTSTORE_ROOT null );
}
return BtstoreRoot::$root;
}
From:http://tw.wingwit.com/Article/program/PHP/201311/20958.html