遍历对象
PHP 5 提供了一种定义对象的方法使其可以通过单元列表来遍历,例如用 foreach语句。默认情况下,所有可见属性都将被用于遍历。
- <?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 ();
- /**
- var1 => value 1
- var2 => value 2
- var3 => value 3MyClass::iterateVisible:
- var1 => value 1
- var2 => value 2
- var3 => value 3
- protected => protected var
- private => private var
- **/
更进一步,可以实现 Iterator 接口。可以让对象自行决定如何遍历以及每次遍历时那些值可用。
- <?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:
- **/
可以用 IteratorAggregate 接口以替代实现所有的 Iterator 方法。 IteratorAggregate 只需要实现一个方法 IteratorAggregate::getIterator() ,其应返回一个实现了 Iterator 的类的实例。
- <?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:
- **/