在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;
}
/* (non-PHPdoc)
* @see ArrayAccess::offsetExists()
*/
public function offsetExists($offset)
{
return $this->__isset ( $offset );
}
/* (non-PHPdoc)
* @see ArrayAccess::offsetGet()
*/
public function offsetGet($offset)
{
return $this->__get ( $offset );
}
/* (non-PHPdoc)
* @see ArrayAccess::offsetSet()
*/
public function offsetSet($offset, $value)
{
trigger_error ( 'offsetSet not implemented by BtstoreElement' );
}
/* (non-PHPdoc)
* @see ArrayAccess::offsetUnset()
*/
public function offsetUnset($offset)
{
trigger_error ( 'offsetUnset not implemented by BtstoreElement' );
}
/* (non-PHPdoc)
* @see Iterator::current()
*/
public function current()
{
return current ( $this->arrData );
}
/* (non-PHPdoc)
* @see Iterator::next()
*/
public function next()
{
return next ( $this->arrData );
}
/* (non-PHPdoc)
* @see Iterator::key()
*/
public function key()
{
return key ( $this->arrData );
}
/* (non-PHPdoc)
* @see Iterator::valid()
*/
public function valid()
{
$data = current ( $this->arrData );
return ! empty ( $data );
}
/* (non-PHPdoc)
* @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;
}