php中重载数组操作符

来源:互联网 发布:棋牌类游戏的算法代码 编辑:程序博客网 时间:2024/05/18 02:48

在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;}