php中的类与对象(遍历)

来源:互联网 发布:i wrote python 编辑:程序博客网 时间:2024/05/25 18:12

默认的遍历

对象可以直接使用foreach进行遍历,默认情况下,将遍历全部可见属性。

class MyClass{  private $var1 = [1,2,3];  public $var2 = [4,5,6];  public function iter() {    foreach ($this as $key => $val) {      echo "key: $key => val:\n";      var_dump($val);    }  }}$a = new MyClass;$a->iter();echo "**************\n";foreach($a as $key => $val) {  echo "key: $key => val:\n";  var_dump($val);}/*key: var1 => val:array(3) {  [0]=>  int(1)  [1]=>  int(2)  [2]=>  int(3)}key: var2 => val:array(3) {  [0]=>  int(4)  [1]=>  int(5)  [2]=>  int(6)}**************key: var2 => val:array(3) {  [0]=>  int(4)  [1]=>  int(5)  [2]=>  int(6)}*/


Iterator接口

如果类继承了此接口,则可以通过实现该接口中的方法来控制遍历过程,这些方法包括:

abstract public mixed Iterator::current ( void ) 
- 返回当前元素

abstract public scalar Iterator::key ( void ) 
- 返回当前元素的键(失败时返回null)

abstract public void Iterator::next ( void ) 
- 向前移动到下一个元素

abstract public void Iterator::rewind ( void ) 
- 返回到第一个元素,在foreach开始前被自动调用

abstract public boolean Iterator::valid ( void ) 
- 此方法在 Iterator::rewind() 和 Iterator::next() 方法之后被调用以此用来检查当前位置是否有效。 


class MyClass implements Iterator{  private $var1 = [1, 2, 3];  private $var2 = [4, 5, 6];  private $site = 0;  private function getDat($site) {    if ($site < count($this->var1)) {      return $this->var1[$site];    }     else {      return $this->var2[$site - count($this->var1)];    }  }  // foreach前被调用  public function rewind() {    $this->site = 0;  }  // 返回当前项的值  public function current() {    return $this->getDat($this->site);  }  // 返回当前项的键  public function key() {    return $this->site;  }  // 移到下一项  public function next() {    $this->site++;  }   // 判断遍历是否已结束  public function valid() {    if($this->site < count($this->var1) + count($this->var2))      return true;    return false;  }}$a = new MyClass;foreach ($a as $key => $val) {  echo "key: $key => val: $val\n";}/*key: 0 => val: 1key: 1 => val: 2key: 2 => val: 3key: 3 => val: 4key: 4 => val: 5key: 5 => val: 6*/


IteratorAggregate接口

类实现此接口后也可以实现对遍历的控制,该接口只有一个方法:

abstract public Traversable IteratorAggregate::getIterator ( void )

虽然方法简单,但此方法的返回值却要求是一个实现了 Iterator 或 Traversable 接口的类的一个实例。 下例仍然会使用到Iterator接口,但可以定义一个相对通用一点的类。

class MyIterator implements Iterator{  private $arr;  private $site = 0;  public function __construct($arr) {    $this->arr = $arr;  }  // foreach前被调用  public function rewind() {    $this->site = 0;  }  // 返回当前项的值  public function current() {    return $this->arr[$this->site];  }  // 返回当前项的键  public function key() {    return $this->site;  }  // 移到下一项  public function next() {    $this->site++;  }   // 判断遍历是否已结束  public function valid() {    if($this->site < count($this->arr))      return true;    return false;  }}class MyClass implements IteratorAggregate{  private $var1 = [1,2,3];  private $var2 = [4,5,6];  public function getIterator() {    return new MyIterator(array_merge($this->var1, $this->var2));  }}$a = new MyClass;foreach ($a as $key => $val) {  echo "key: $key => val: $val\n";}/*key: 0 => val: 1key: 1 => val: 2key: 2 => val: 3key: 3 => val: 4key: 4 => val: 5key: 5 => val: 6*/



原创粉丝点击