PHP5对象迭代(Object Iteration)

PHP5提供一个为对象定义通过一连串的消息被重述的途径成为可能,例如使用一个foreach语句。默认地,所有可见的属性将用来迭代(反复)。

简单的对象迭代(Simple Object Iteration)

PHP代码如下:

<?php
class MyClass
{   public $var1 = 'value 1';
    public $var2 = 'value 2';
    public $var3 = 'value 3';
    protected $protected = 'protected var';
    private   $private   = 'private var';
    function iterateVisible() 
    {   echo "MyClass::iterateVisible:\n";
       foreach($this as $key => $value){  print "$key => $value\n";  }
    }
}
$class = new MyClass();
foreach($class as $key => $value){   print "$key => $value\n";  }
echo "\n";
$class->iterateVisible();
?>


如输出显示,foreach重述能通过全部可见变量被访问。更进一步,你可以实现一个PHP5的指定的内在接口迭代器(Iterator)。允许对象描述什么是对象重述和对象如何被重述的。

迭代器实现对象迭代(Object Iteration implementing Iterator)

PHP代码如下:

<?php
class MyIterator implements Iterator
{   private $var = array();
    public function __construct($array)
    {   if (is_array($array)){  $this->var = $array; }
    }
    public function rewind() 
    {    echo "rewinding\n";
        reset($this->var);
 }
    public function current()
    {   $var = current($this->var);
        echo "current: $var\n";
        return $var;
    }
    public function key() 
    {    $var = key($this->var);
        echo "key: $var\n";
        return $var;
    }
    public function next() 
    {    $var = next($this->var);
        echo "next: $var\n";
        return $var;
    }
    public function valid() 
    {    $var = $this->current() !== false;
        echo "valid: {$var}\n";
        return $var;
    }
}
$values = array(1,2,3);
$it = new MyIterator($values);
foreach ($it as $a => $b) {  print "$a: $b\n";  }
?>

上例将输出:

rewinding
current: 1
valid: 1
current: 1
key: 0
0: 1
next: 2
current: 2
valid: 1
current: 2
key: 1
1: 2
next: 3
current: 3
valid: 1
current: 3
key: 2
2: 3
next:
current:
valid:

在定义类时你也可以不必通过简单实现PHP5的IteratorAggregate接口定义所有的迭代器函数。

IteratorAggregate对象迭代实现

PHP代码如下:

<?php
class MyCollection implements IteratorAggregate
{   private $items = array();
    private $count = 0;
    // Required definition of interface IteratorAggregate
    public function getIterator() 
    {    return new MyIterator($this->items);
    }
     public function add($value) 
    {    
        $this->items[$this->count++] = $value;
    }
}
$coll = new MyCollection();
$coll->add('value 1');
$coll->add('value 2');
$coll->add('value 3');
foreach ($coll as $key => $val){  echo "key/value: [$key -> $val]\n\n";  }
?>

上例将输出:

rewinding
current: value 1
valid: 1
current: value 1
key: 0
key/value: [0 -> value 1]
next: value 2
current: value 2
valid: 1
current: value 2
key: 1
key/value: [1 -> value 2]
next: value 3
current: value 3
valid: 1
current: value 3
key: 2
key/value: [2 -> value 3]
next:
current:
valid:
  1. 还没有评论