← 返回文章列表

PHP的foreach和Iterator接口

介绍

foreach可以遍历数组和对象,获取key和value值。

对于数值array()的遍历,很好理解,参照php.net

foreach遍历对象

foreach遍历对象时,会将对象分为两类,一般的对象和继承Iterator接口的对象。

对于一般的对象,foreach会遍历对象的可见属性,获取属性名和值作为key-value。外部foreach对象可获取public的属性,对象内部foreach $this,可以获取public、protected、private(继承的不获取)。详细的内容可以参照php.net

对于实现Iterator接口的对象,会按照接口的实现方式执行foreach。

foreach($iteratorClass as $key=>$value){
}

Iterator接口

Iterator(迭代器的定义)

 Iterator extends Traversable {
    /* Methods */
    abstract public mixed current ( void )
    abstract public scalar key ( void )
    abstract public void next ( void )
    abstract public void rewind ( void )
    abstract public boolean valid ( void )
}

一个类实现Iterator的接口:

class myIterator implements Iterator {
    //自定义的属性方法
    //实现Iterator接口的方法
    //......
    //rewind() foreach开始时执行的操作
    //valid() 用于判断foreach是否结束,需return bool值,true继续遍历,false终止遍历
    //key() 返回当前遍历中的key值,需return ,作为$key
    //current() 返回当前遍历中的value值,需return,作为$value
    //next() 当前轮遍历后执行的操作
}

执行的流程,直到valid()返回flase时终止:

  • rewind()
  • –––––循环–––––
  • valid()
  • current()
  • key()
  • 执行foreach{}中的操作
  • next()
  • –––––循环–––––