helly           Mon Jun 23 18:37:13 2003 EDT

  Modified files:              
    /spl        README 
  Log:
  Put some brief technically description here
  
Index: spl/README
diff -u spl/README:1.2 spl/README:1.3
--- spl/README:1.2      Sat May 24 09:47:49 2003
+++ spl/README  Mon Jun 23 18:37:12 2003
@@ -1,36 +1,88 @@
 This is an extension that aims to implement some efficient data access 
-interfaces and classes.
+interfaces and classes. You'll find the classes documented using php
+code in the file spl.php.
 
-SPL allows to hook into foreach. Doing so you can do something like
-this:
-
-       $obj = new whatever();
-       foreach($obj as $key => $value) { ... }
-
-This is meant to be used for database access. For example you could
-grab my patch to sqlite (<a 
href="http://marcus-boerger.de/php/ext/sqlite/";>http://marcus-boerger.de/php/ext/sqlite/</a>)
 and
-look at the oo tests:
-
-       $db = new sqlite($filename);
-       foreach($db->query("SELECT....") as $row) { ... }
-
-SQLite offers four access strategies:
-1) sqlite_query + sqlite_fetch_array
-2) sqlite_unbuffered_query + sqlite_fetch_array
-3) sqlite_query + iterators (sqlite_current)
-4) sqlite_unbuffered_query + iterators (sqlite_current)
-
-1) and 3) do "over eager evaluating" since they fetch all rows directly.
-
-2) does "eager evaluating". It always fetches the next row but doesn't 
-keep the current row, so that it must be stored elsewhere if it must be 
-accessed more then once. For instance this happens when you need to access 
-columns separately.
-
-4) does "eager evaluating". But in contrast to 2) it keeps the current row
-hence its name.
-
-There is no efficient way for "lazy or just in time evaluating" so 4) should 
-be the best case. And 4) also enables the foreach trick.
-
-To implement 3) and 4) with other db extensions ask me and wait for LT to pass.
+There are special SPL interfaces that provides the ability to hook into 
+foreach and array reading/writng. By inheriting these interfaces, instances 
+of the resulting classes can be iterated using the foreach construct or
+use array read write notation.
+
+Look into the examples subdirectory for some basic examples which will
+demonstracte this.
+
+Also some classes of extensions like SQLite inherit SPL interfaces so that
+they take advantage of the foreach or array overloading.
+
+1) Iterators
+
+Iterator is design pattern that allows to enumerate and list all elements of 
+a collection whatsoever using an oo protocol. The minimalistic Iterator needs
+a method that returns the current value, a method that moves to the next value
+and a method that checks whether or not the Iterator can provide more elements.
+
+In SPL this basich Iterator is defined by the interface spl_forward:
+
+interface spl_forward {
+       function current();
+       function next();
+       function has_more();
+}
+
+This basic Iterator does not allow to rewind itself nor does it in anyway 
+support to name the values by some kind association as key/value mappings
+provided by the standard PHP arrays. All these additions to the basic Iterator
+are done in specialized interfaces as described in detail in the file spl.php.
+
+SPL allows to hook into the engine opcodes that realize the foreach construct.
+This construct normally works on arrays the following way. First it rewinds 
+the current array position to the beginning. Then it loops through the whole
+array by first checking whether or not the end of the array is reached and
+if not returning the current array value and or key. After that it move the
+current array pointer forward and does starts the loop process again. As you 
+can see this perfectly maps to the interface spl_forward. So the foreach
+hooking simply checks whether or not the variable passed to foreach is an
+object of a class implementing the interface spl_forward. The foreach hook
+can be activated by --enable-spl-foreach which is on by default.
+
+class it implements spl_forward...
+$obj = new it();
+foreach($obj as $value) ...
+
+2) Arrays
+
+Arrays in general, not specifically PHP arrays, provide a collection of pairs
+normally referred to as key and value. A PHP object consists of properties and
+a class type specifing the methods available for the object. SPL now allows
+this to be combined using the spl_array_<xy> interfaces.
+
+The minimalistic array interface is spl_array_read which only support reading:
+
+interface spl_array_read {
+       function exists($key);
+       function get($key);
+}
+
+Any instance of a class that implements spl_array_read can be used with array
+read notation when the corresponding hook is activated --enable-spl-array-read.
+
+class ar implements spl_array_read...
+$obj = new ar();
+$value = $obj[$key];
+
+SPL also supports the write notation by the interface spl_array_access:
+
+interface spl_array_access extends spl_array_read {
+       function set($value, $index);
+}
+
+When the array write hook is activated by --enable-spl-array-write the 
+following can be done:
+
+class ar implements spl_array_access...
+$obj = new ar();
+$value = $obj[$key];
+$obj[$key] = $value;
+
+However this hook should only be activated when it is made use of, since it 
+slows down noticeable. That is the case because first there is some not used
+overhead and second the overhead is in one the most often used opcodes.
\ No newline at end of file



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to