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

Reply via email to