curt Fri Jul 23 16:06:04 2004 EDT
Modified files: /phpdoc/en/language/oop5 iterations.xml Log: New iteration documentation. http://cvs.php.net/diff.php/phpdoc/en/language/oop5/iterations.xml?r1=1.1&r2=1.2&ty=u Index: phpdoc/en/language/oop5/iterations.xml diff -u phpdoc/en/language/oop5/iterations.xml:1.1 phpdoc/en/language/oop5/iterations.xml:1.2 --- phpdoc/en/language/oop5/iterations.xml:1.1 Sun Jul 11 08:33:25 2004 +++ phpdoc/en/language/oop5/iterations.xml Fri Jul 23 16:06:04 2004 @@ -1,12 +1,216 @@ <?xml version="1.0" encoding="iso-8859-1"?> -<!-- $Revision: 1.1 $ --> +<!-- $Revision: 1.2 $ --> <sect1 id="language.oop5.iterations"> <title>Object Iteration</title> <para> - . + PHP 5 provides a way for objects to to be defined so it is possible + to iterate through a list of items, with, for example a <xref + linkend="control-structures.foreach" /> statement. By default, all + public properties will be used for the iteration. </para> + <example> + <title>Simple Object Iteration</title> + <programlisting role="php"> +<![CDATA[ +<?php +class MyClass { + public $var1 = 'value 1'; + public $var2 = 'value 2'; + public $var3 = 'value 3'; + + protected $protected = 'protected'; + private $private = 'private'; + +} + +$class = new MyClass(); + +foreach($class as $key => $value) { + print "$key => $value\n"; +} +]]> + </programlisting> + <para> + Will output: + </para> + <screen role="php"> +<![CDATA[ +var1 => value 1 +var2 => value 2 +var3 => value 3 +]]> + </screen> + + </example> + + <para> + As the output shows, the <xref linkend="control-structures.foreach" /> + iterated through each public variable that is defined. To take it + a step further you can <varname>implement</varname> one of PHP 5's + internal <xref linkend="language.oop5.interfaces" /> named + <varname>Iterator</varname>. This allows the object to decide what + and how the object will be iterated. + </para> + + <example> + <title>Object Iteration implenting Iterator</title> + <programlisting role="php"> +<![CDATA[ +<?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"; +} +]]> + </programlisting> + <para> + Will output: + </para> + <screen role="php"> +<![CDATA[ +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: +]]> + </screen> + + </example> + + <para> + You can also define your class so that it doesn't have to define + all the <varname>Iterator</varname> functions by simply implementing + the PHP 5 <varname>IteratorAggregate</varname> interface. + </para> + + <example> + <title>Object Iteration implenting IteratorAggregate</title> + <programlisting role="php"> +<![CDATA[ +<?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"; +} + +?> +</pre> +]]> + </programlisting> + <para> + Will output: + </para> + <screen role="php"> +<![CDATA[ +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: +]]> + </screen> + + </example> </sect1> <!-- Keep this comment at the end of the file