点击这里给我发消息 点击这里给我发消息

php重载数组操作符

添加时间:2013-12-6
    相关阅读: PHP Access

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

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册