欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

php重载数组操作符

程序员文章站 2022-05-11 20:02:19
...
在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;
}