PHP 5 provides a way for objects to be defined so it is possible to iterate through a list of items, with, for example a foreach statement. By default, all visible properties will be used for the iteration.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?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(); ?> |
The above example will output:
var1 => value 1 var2 => value 2 var3 => value 3 MyClass::iterateVisible: var1 => value 1 var2 => value 2 var3 => value 3 protected => protected var private => private var
As the output shows, the foreach iterated through all of the visible properties that could be accessed.
To take it a step further, the Iterator interface may be implemented. This allows the object to dictate how it will be iterated and what values will be available on each iteration.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | <?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() { $key = key( $this -> var ); $var = ( $key !== NULL && $key !== 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" ; } ?> |
The above example will output:
rewinding valid: 1 current: 1 key: 0 0: 1 next: 2 valid: 1 current: 2 key: 1 1: 2 next: 3 valid: 1 current: 3 key: 2 2: 3 next: valid:
The IteratorAggregate interface can be used as an alternative to implementing all of the Iterator methods. IteratorAggregate only requires the implementation of a single method, IteratorAggregate::getIterator(), which should return an instance of a class implementing Iterator.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?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" ; } ?> |
The above example will output:
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:
Please login to continue.