php 中的ArrayAccess 和 Iterator

ArrayAccess 实现了对象的数组访问

Iterator 则提供了扩展遍历对象时在操作数组指针时的动作

 

 
   
<?php


class arr implements ArrayAccess, Iterator
{

public $arr;

public $keyArr;

public $currentIndex = 0;

public $arrCount = 0;

public function __construct(array $arr)
{
$this->arr = $arr;

$this->arrCount = count($arr);
}

// ArrayAccess

public function offsetExists($offset)
{
return array_key_exists($offset, $this->arr);
}

public function offsetSet($offset, $val)
{
$this->arr[$offset] = $val;
}

public function offsetGet($offset)
{
return $this->arr[$offset];
}

public function offsetUnset($offset)
{
unset($this->arr[$offset]);
$this->arrCount = count($this->arr);
return true;
}


//Iterator

public function rewind()
{
echo 'rewind<br>';
reset($this->arr);
}

public function key()
{
echo 'key<br>';
return key($this->arr);

}

public function current()
{
echo 'current<br>';
return current($this->arr);
}

public function next()
{
echo 'next<br>';
next($this->arr);
++$this->currentIndex;
}

public function valid()
{
echo 'valid<br>';

return ($this->arrCount >= $this->currentIndex);
}

}



$arr = new arr(['one' => 'sdf','1' => 'sdf', '2' => 'eew']);

var_dump($arr['one']);

foreach ($arr as $key => $v) {
var_dump($key, $v);
}

exit;

ArrayAccess 所需要实现的方法较为简单,从字意上就可理解。

Iterator提供的方法较多,它的执行顺序有必要记录下:

  1. rewind 将数组指针指向最前一个元素 
  2. valid  判断当前指针下,该键值存在的合法性,不合法则终止访问过程,以返回true or false来判断
  3. current 则返回当前键值
  4. key 则返回当前键名
  5. 进入循环
  6. next 指针向下移动一位
  7. valid 
  8. current
  9. key
  10. next ......

但在一点需注意,面对数字由0 开始的递增数组,我们可用isset($arr[$key])判断其合法性,当然,next() 时则需要++$key.

但当,键名并非这种特殊情况时,则需另一种方式来判断合法性。则是通过它的长度,即以上方法,但当unset时,则需更新$arr

的长度。

 

你可能感兴趣的:(iterator)