WEB开发网
开发学院WEB开发PHP php重载数组操作符 阅读

php重载数组操作符

 2013-01-06 15:11:37 来源:WEB开发网   
核心提示: 在php中提供了许多接口用于实现一些很特定的功能,比如你想把一个对象当作array使用时,php重载数组操作符,只需要实现ArrayAccess接口,当你想要foreach中能够使用一个对象时

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

Tags:php 重载 数组

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接