nlopess         Mon Jul 26 07:47:30 2004 EDT

  Modified files:              
    /phpdoc/en/appendices       migration5.xml 
  Log:
  remove the oop docs and link to the new oop5 language reference
  
http://cvs.php.net/diff.php/phpdoc/en/appendices/migration5.xml?r1=1.25&r2=1.26&ty=u
Index: phpdoc/en/appendices/migration5.xml
diff -u phpdoc/en/appendices/migration5.xml:1.25 
phpdoc/en/appendices/migration5.xml:1.26
--- phpdoc/en/appendices/migration5.xml:1.25    Wed Jul 21 05:05:12 2004
+++ phpdoc/en/appendices/migration5.xml Mon Jul 26 07:47:30 2004
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="iso-8859-1"?>
-<!-- $Revision: 1.25 $ -->
+<!-- $Revision: 1.26 $ -->
  <appendix id="migration5">
   <title>Migrating from PHP 4 to PHP 5</title>
 
@@ -799,1015 +799,14 @@
     out of the box, or with very few modifications.
    </para>
    <para>
+    The new Object Model is documented at the <link
+     linkend="language.oop5">Language Reference</link>.
+   </para>
+   <para>
     See also the <link linkend="ini.zend.ze1-compatibility-mode">
     zend.ze1_compatibility_mode</link> directive for compatability with 
     PHP 4. 
    </para>
-
-   <section id='migration.oop.members'>
-    <title>Private and Protected Members</title>
-    <para>
-     PHP 5 introduces private and protected member variables, they allow you
-     to define the visibility of class properties.
-    </para>
-    <example>
-     <title>Private and Protected Members accesibility</title>
-     <simpara>
-      Protected member variables can be accessed in classes extending the
-      class they are declared in, whereas private member variables can only be
-      accessed by the class they belong to.
-     </simpara>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class MyClass {
-    private $Hello = "Hello, World!\n";
-    protected $Bar = "Hello, Foo!\n";
-    protected $Foo = "Hello, Bar!\n";
-
-    function printHello() {
-        print "MyClass::printHello() " . $this->Hello;
-        print "MyClass::printHello() " . $this->Bar;
-        print "MyClass::printHello() " . $this->Foo;
-    }
-}
-
-class MyClass2 extends MyClass {
-    protected $Foo;
-              
-    function printHello() {
-        MyClass::printHello();                          /* Should print */
-        print "MyClass2::printHello() " . $this->Hello; /* Shouldn't print out 
anything */
-        print "MyClass2::printHello() " . $this->Bar;   /* Shouldn't print (not 
declared)*/
-        print "MyClass2::printHello() " . $this->Foo;   /* Should print */
-    }
-}
-
-$obj = new MyClass();
-print $obj->Hello;  /* Shouldn't print out anything */
-print $obj->Bar;    /* Shouldn't print out anything */
-print $obj->Foo;    /* Shouldn't print out anything */
-$obj->printHello(); /* Should print */
-
-$obj = new MyClass2();
-print $obj->Hello;  /* Shouldn't print out anything */
-print $obj->Bar;    /* Shouldn't print out anything */
-print $obj->Foo;    /* Shouldn't print out anything */
-$obj->printHello();
-?>
-]]>
-     </programlisting>
-    </example>
-   </section>
-   
-   <section id='migration.oop.methods'>
-    <title>Private and Protected Methods</title>
-    <para>
-     With PHP 5, private and protected methods are also introduced.
-    </para>
-    <example>
-     <title>Protected methods example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class Foo {
-    private function aPrivateMethod() {
-        echo "Foo::aPrivateMethod() called.\n";
-    }
-
-    protected function aProtectedMethod() {
-        echo "Foo::aProtectedMethod() called.\n";
-        $this->aPrivateMethod();
-    }
-}
-
-class Bar extends Foo {
-    public function aPublicMethod() {
-        echo "Bar::aPublicMethod() called.\n";
-        $this->aProtectedMethod();
-    }
-}
-
-$o = new Bar;
-$o->aPublicMethod();
-?>
-]]>
-     </programlisting>
-    </example>
-    <simpara>
-     Old code that has no user-defined classes or functions named 
-     &quot;public&quot;, &quot;protected&quot; or &quot;private&quot; should
-     run without modifications.
-    </simpara>
-   </section>
-
-   <section id='migration.oop.abstract'>
-    <title>Abstract Classes and Methods</title>
-    <para>
-     PHP 5 also introduces abstract classes and methods. An abstract method
-     only declares the method's signature and does not provide an
-     implementation. A class that contains abstract methods needs to be
-     declared abstract.
-    </para>
-    <example>
-     <title>Abstract class example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-abstract class AbstractClass {
-    abstract public function test();
-}
-
-class ImplementedClass extends AbstractClass {
-    public function test() {
-        echo "ImplementedClass::test() called.\n";
-    }
-}
-
-$o = new ImplementedClass;
-$o->test();
-?> 
-]]>
-     </programlisting>
-    </example>
-    <simpara>
-     Abstract classes cannot be instantiated. Old code that has no
-     user-defined classes or functions named 'abstract' should run without
-     modifications.
-    </simpara>
-   </section> 
-   
-   <section id='migration.oop.interfaces'>
-    <title>Interfaces</title>
-    <para>
-     PHP 5 introduces interfaces. A class may implement an arbitrary list of
-     interfaces.
-    </para>
-    <example>
-     <title>Interface example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-interface Throwable {
-    public function getMessage();
-}
-
-class MyException implements Throwable {
-    public function getMessage() {
-        // ...
-    }
-}
-?> 
-]]>
-      </programlisting>
-    </example>
-    <simpara>
-     Old code that has no user-defined classes or functions named 'interface'
-     or 'implements' should run without modifications. 
-    </simpara>
-   </section>
-
-   <section id='migration.oop.typehints'>
-    <title>Class Type Hints</title>
-    <para>
-     While remaining loosely typed PHP 5 introduces the ability to use class
-     type hints to declare the expected class of objects that are passed as
-     parameters to a method.
-    </para>
-    <example>
-     <title>Class type hinting example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-interface Foo {
-    function a(Foo $foo);
-}
-
-interface Bar {
-    function b(Bar $bar);
-}
-
-class FooBar implements Foo, Bar {
-    function a(Foo $foo) {
-        // ...
-    }
-
-    function b(Bar $bar) {
-        // ...
-    }
-}
-
-$a = new FooBar;
-$b = new FooBar;
-
-$a->a($b);
-$a->b($b);
-?>
-]]>
-      </programlisting>
-    </example>
-    <simpara>
-     These class type hints are not checked upon compilation, as would be the
-     case in a typed language, but during runtime. This means that: 
-    </simpara>
-    <informalexample>
-     <programlisting role="php">
-<![CDATA[
-<?php
-function foo(ClassName $object) {
-    // ...
-}
-?>
-]]>
-      </programlisting>
-    </informalexample>
-    <simpara>is equivalent to:</simpara>
-    <informalexample>
-      <programlisting role="php">
-<![CDATA[
-<?php
-function foo($object) {
-    if (!($object instanceof ClassName)) {
-        die("Argument 1 must be an instance of ClassName");
-    }
-}
-?>
-]]>
-      </programlisting>
-    </informalexample>
-   </section>
-
-   <section id='migration5.oop.final'>
-    <title>final</title>
-    <para>
-     PHP 5 introduces the "final" keyword to declare final members and
-     methods. Methods and members declared final cannot be overridden by
-     sub-classes.
-    </para>
-    <example>
-     <title>final method</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class Foo {
-    final function bar() {
-        // ...
-    }
-}
-?>
-]]>
-     </programlisting>
-    </example>
-    <para>
-     It is furthermore possible to make a class final. Doing this prevents a
-     class from being specialized (it cannot be inherited by another class).
-     There's no need to declare the methods of a final class themselves as
-     final.
-    </para>
-    <example>
-     <title>final class</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-final class Foo {
-    // class definition
-}
-
-// the next line is impossible
-// class Bork extends Foo {}
-?>
-]]>
-     </programlisting>
-    </example>
-    <para>
-     Properties can not be final.
-    </para>
-    <para>
-     Old code that has no user-defined classes or functions named 'final'
-     should run without modifications.
-    </para>
-   </section>
-
-   <section id='migration5.oop.cloning'>
-    <title>Objects Cloning</title>
-    <para>
-     PHP 4 offered no way a user could decide what copy constructor to run
-     when an object is duplicated. During duplication, PHP 4 did a bit for bit
-     copy making an identical replica of all the object's properties.
-    </para>
-    <para>
-     Creating a copy of an object with fully replicated properties is not
-     always the wanted behavior. A good example of the need for copy
-     constructors, is if you have an object which represents a GTK window and
-     the object holds the resource of this GTK window, when you create a
-     duplicate you might want to create a new window with the same properties
-     and have the new object hold the resource of the new window. Another
-     example is if your object holds a reference to another object which it
-     uses and when you replicate the parent object you want to create a new
-     instance of this other object so that the replica has its own separate
-     copy.
-    </para>
-    <para>
-     An object copy is created by using the clone keyword (which calls the
-     object's <function>__clone</function> method if possible). An object's 
-     <function>__clone</function>  method cannot be called directly. 
-    </para>
-    <para>
-     When the developer asks to create a new copy of an object, PHP 5 will
-     check if a <function>__clone</function> method has been defined or not. 
-     If not, it will call a default __clone() which will copy all of the object's
-     properties. If a <function>__clone</function> method is defined, then it
-     will be responsible to set the necessary properties in the created object.
-     For convenience, the engine will supply a function that imports all of the
-     properties from the source object, so that they can start with a by-value
-     replica of the source object, and only override properties that need to be
-     changed.
-    </para>
-    <example>
-     <title>Objects cloning</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class MyCloneable {
-    static $id = 0;
-
-    function MyCloneable() {
-        $this->id = self::$id++;
-    }
-
-    function __clone() {
-        $this->address = "New York";
-        $this->id = self::$id++;
-    }
-}
-
-$obj = new MyCloneable();
-
-$obj->name = "Hello";
-$obj->address = "Tel-Aviv";
-
-print $obj->id . "\n";
-
-$obj_cloned = clone $obj;
-
-print $obj_cloned->id . "\n";
-print $obj_cloned->name . "\n";
-print $obj_cloned->address . "\n";
-?>
-]]>
-     </programlisting>
-    </example>
-   </section>
-
-   <section id='migration5.oop.constructors'>
-    <title>Constructors</title>
-    <para>
-     PHP 5 allows developers to declare constructor methods for classes.
-     Classes which have a constructor method call this method on each
-     newly-created object, so it is suitable for any initialization that the
-     object may need before it is used.
-    </para>
-    <para>
-     With PHP 4, constructor methods were class methods that had the same name
-     as the class itself. Since it is very common to call parent constructors
-     from derived classes, the way PHP 4 worked made it a bit cumbersome to
-     move classes around in a large class hierarchy. If a class is moved to
-     reside under a different parent, the constructor name of that parent
-     changes as well, and the code in the derived class that calls the parent
-     constructor has to be modified.
-    </para>
-    <para>
-     PHP 5 introduces a standard way of declaring constructor methods by
-     calling them by the name <function>__construct</function>.
-    </para>
-    <example>
-     <title>using new unified constructors</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class BaseClass {
-    function __construct() {
-        print "In BaseClass constructor\n";
-    }
-}
-
-class SubClass extends BaseClass {
-    function __construct() {
-        parent::__construct();
-        print "In SubClass constructor\n";
-    }
-}
-
-$obj = new BaseClass();
-$obj = new SubClass();
-?> 
-]]>
-     </programlisting>
-    </example>
-    <para>
-     For backwards compatibility, if PHP 5 cannot find a 
-     <function>__construct</function> function for a given class, it will
-     search for the old-style constructor function, by the name of the class.
-     Effectively, it means that the only case that would have compatibility
-     issues is if the class had a method named 
-     <function>__construct</function> which was used for different semantics.
-    </para>
-   </section>
-
-   <section id='migration5.oop.destructors'>
-    <title>Destructors</title>
-    <para>
-     Having the ability to define destructors for objects can be very useful.
-     Destructors can log messages for debugging, close database connections
-     and do other clean-up work. No mechanism for object destructors existed
-     in PHP 4, although PHP had already support for registering functions
-     which should be run on request shutdown.
-    </para>
-    <para>
-     PHP 5 introduces a destructor concept similar to that of other
-     object-oriented languages, such as Java: When the last reference to an
-     object is destroyed the object's destructor, which is a class method
-     named <function>__destruct</function>  that receives no parameters, is
-     called before the object is freed from memory.
-    </para>
-    <example>
-     <title>Destructor</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class MyDestructableClass {
-    function __construct() {
-        print "In constructor\n";
-        $this->name = "MyDestructableClass";
-    }
-
-    function __destruct() {
-        print "Destroying " . $this->name . "\n";
-    }
-}
-
-$obj = new MyDestructableClass();
-?> 
-]]>
-     </programlisting>
-    </example>
-    <para>
-     Like constructors, parent destructors will not be called implicitly by
-     the engine. In order to run a parent destructor, one would have to
-     explicitly call <function>parent::__destruct</function> in the destructor
-     body.
-    </para>
-   </section>
-
-   <section id='migration5.oop.constants'>
-    <title>Constants</title>
-    <para>
-     PHP 5 introduces per-class constants:
-    </para>
-    <example>
-     <title>Class constant example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class Foo {
-    const constant = "constant";
-}
-
-echo "Foo::constant = " . Foo::constant . "\n";
-?> 
-]]>
-     </programlisting>
-    </example>
-    <simpara>
-     Old code that has no user-defined classes or functions named 'const'
-     will run without modifications.
-    </simpara>
-   </section>
-   
-   <section id='migration5.oop.exceptions'>
-    <title>Exceptions</title>
-    <para>
-     PHP 4 had no exception handling. PHP 5 introduces a exception model
-     similar to that of other programming languages. Note that there is
-     support for "catch all" but not for the "finally" clause.
-    </para>
-    <para>
-     Exceptions can be rethrown in catch blocks. Also it is possible to have
-     multiple catch blocks. In that case the caught exception is compared with
-     the classtype of each catch block from top to bottom and the first block
-     that has an 'instanceof' match gets executed. When the catch block
-     finishes, execution continues at the end of the last catch block. If no
-     catch block has an 'instanceof' match then the next try/catch block is
-     searched until no more try/catch blocks are available. In that case the
-     exception is an uncaught exception and the program terminates with
-     showing the exception.
-    </para>
-    <example>
-     <title>Exception creation example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-try {
-   throw new Exception('Hello');
-}
-catch (Exception $exception) {
-   echo $exception;
-}
-?>
-]]>
-     </programlisting>
-    </example>
-    <simpara>
-     Old code that has no user-defined classes or functions 'catch', 'throw'
-     and 'try' will run without modifications.
-    </simpara>
-   </section>
-    
-   <section id='migration5.oop.dereferencing'>
-    <title>Dereferencing objects returned from functions</title>
-    <para>
-     In PHP 4 it wasn't possible to dereference objects returned by functions
-     and make further method calls on those objects. With PHP 5, the following
-     is now possible:
-    </para> 
-    <example>
-     <title>Dereferencing example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class Circle {
-    function draw() {
-        print "Circle\n";
-    }
-}
-      
-class Square {
-    function draw() {
-        print "Square\n";
-    }
-}
-
-function ShapeFactoryMethod($shape) {
-    switch ($shape) {
-        case "Circle":
-            return new Circle();
-        case "Square":
-            return new Square();
-    }
-}
-
-ShapeFactoryMethod("Circle")->draw();
-ShapeFactoryMethod("Square")->draw();
-?> 
-]]>
-     </programlisting>
-    </example>
-   </section>
-
-   <section id='migration5.oop.staticinit'>
-    <title>Static member variables initialization</title>
-    <para>
-     Static member variables of static classes can now be initialized.
-    </para>
-    <example>
-     <title>Static variable initialization example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class foo {
-    static $my_static = 5;
-    public $my_prop = 'bla';
-}
-
-print foo::$my_static;
-$obj = new foo;
-print $obj->my_prop;
-?>
-]]>
-     </programlisting>
-    </example>
-   </section>
-
-   <section id='migration5.oop.staticmethods'>
-    <title>Static Methods</title>
-    <para>
-     PHP 5 introduces the 'static' keyword to declare a method static, thus
-     callable from outside the object context.
-    </para>
-    <example>
-     <title> Static Methods example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class Foo {
-    public static function aStaticMethod() {
-        // ...
-    }
-}
-
-Foo::aStaticMethod();
-?>
-]]>
-     </programlisting>
-    </example>
-    <para>
-     The pseudo variable $this is not available inside a method that has been
-     declared static.
-    </para>
-   </section>
-
-   <section id='migration5.oop.instanceof'>
-    <title>instanceof</title>
-    <para>
-     PHP 5 introduces the <literal>instanceof</literal> keyword, that 
-     allows you to ascertain whether or not an object is an instance of
-     a class, or extends a class, or implements an interface.
-    </para>
-    <example>
-     <title><literal>instanceof</literal> example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class baseClass { }
-
-$a = new baseClass;
-
-if ($a instanceof baseClass) {
-    echo "Hello World";
-}
-?>
-]]>
-     </programlisting>
-    </example>
-   </section>
-   
-   <section id='migration5.oop.staticvars'>
-    <title>Static function variables</title>
-    <para>
-     Statics are now treated at compile-time which allows developers to
-     assign variables to statics by reference. This change also greatly
-     improves their performance but means that indirect references to statics
-     will not work anymore.
-    </para>
-   </section>
-
-   <section id='migration5.oop.refparams'>
-    <title>Parameters passed by reference</title>
-    <para>
-     Parameters that are passed by reference to a function may now have
-     default values
-    </para>
-    <example>
-     <title />
-     <programlisting role="php">
-<![CDATA[
-<?php
-function my_function(&$var = null) {
-    if ($var === null) {
-        die("$var needs to have a value");
-    }
-}
-?>
-]]>
-     </programlisting>
-    </example>
-   </section>
-
-   <section id='migration5.oop.autoload'>
-    <title><function>__autoload</function></title>
-    <para>
-     The <function>__autoload</function> interceptor function will be 
-     automatically called when an undeclared class is to be instantiated. 
-     The name of that class will be passed to the <function>__autoload</function>
-     interceptor function as its only argument.
-    </para>
-    <example>
-     <title><function>__autoload</function> example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-function __autoload($className) {
-    include_once $className . ".php";
-}
-
-$object = new ClassName;
-?>
-]]>
-     </programlisting>
-    </example>
-   </section>
-    
-    <section id='migration5.oop.overload'>
-     <title>Overloadable Method calls and Property accesses</title>
-     <para>
-      Both method calls and property accesses can be overloaded via the
-      <function>__call</function>, <function>__get</function> and
-      <function>__set</function> methods. These methods will only be
-      triggered when your object doesn't contain the property or method 
-      your're trying to access.
-     </para>
-     <example>
-      <title>
-       <function>__get</function> and
-       <function>__set</function>
-      </title>
-      <programlisting role="php">
-<![CDATA[
-<?php
-class Setter {
-    public $n;
-    public $x = array("a" => 1, "b" => 2, "c" => 3);
-
-    function __get($nm) {
-        print "Getting [$nm]\n";
-
-        if (isset($this->x[$nm])) {
-            $r = $this->x[$nm];
-            print "Returning: $r\n";
-            return $r;
-        } else {
-            print "Nothing!\n";
-        }
-    }
-
-    function __set($nm, $val) {
-        print "Setting [$nm] to $val\n";
-
-        if (isset($this->x[$nm])) {
-            $this->x[$nm] = $val;
-            print "OK!\n";
-        } else {
-            print "Not OK!\n";
-        }
-    }
-}
-
-$foo = new Setter();
-$foo->n = 1;
-$foo->a = 100;
-$foo->a++;
-$foo->z++;
-var_dump($foo);
-?>
-]]>
-     </programlisting>
-     <screen role="php">
-<![CDATA[
-Setting [a] to 100
-OK!
-Getting [a]
-Returning: 100
-Setting [a] to 101
-OK!
-Getting [z]
-Nothing!
-Setting [z] to 1
-Not OK!
-object(Setter)#1 (2) {
-  ["n"]=>
-  int(1)
-  ["x"]=>
-  array(3) {
-    ["a"]=>
-    int(101)
-    ["b"]=>
-    int(2)
-    ["c"]=>
-    int(3)
-  }
-}
-]]>
-     </screen>
-    </example>
-    <example>
-     <title><function>__call</function> example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class Caller {
-    private $x = array(1, 2, 3);
-
-    function __call($m, $a) {
-        print "Method $m called:\n";
-        var_dump($a);
-        return $this->x;
-    }
-}
-
-$foo = new Caller();
-$a = $foo->test(1, "2", 3.4, true);
-var_dump($a);
-?>
-]]>
-     </programlisting>
-    </example>
-   </section>   
-
-   <section id='migration5.oop.iteration'>
-    <title>Iteration</title>
-    <para>
-     Objects may be iterated in an overloaded way when used with foreach. The
-     default behavior is to iterate over all properties.
-    </para>
-    <example>
-     <title>Object iteration example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class Foo {
-    public $x = 1;
-    public $y = 2;
-}
-
-$obj = new Foo;
-
-foreach ($obj as $prp_name => $prop_value) {
-    // using the property
-}
-?> 
-]]>
-     </programlisting>
-    </example>
-    <para>
-     Each class whose instances can be iterated with foreach should implement
-     the empty interface <literal>Traversable</literal>. Hence any object that
-     says it implements <literal>Traversable</literal> can be used with foreach. 
-    </para>
-    <para>
-     The interfaces <literal>IteratorAggregate</literal> and 
<literal>Iterator</literal>
-     allows you to specify how class objects are iterated in PHP code. The first
-     of them simply has a method <function>getIterator</function> which must
-     return an array or an object that either implements the interface 
-     <literal>Iterator</literal>  or is instantiated from an internal
-     class that can be iterated
-    </para>
-    <example>
-     <title>Iterator creation example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class ObjectIterator implements Iterator {
-
-    private $obj;
-    private $num;
-
-    function __construct($obj) {
-        $this->obj = $obj;
-    }
-    function rewind() {
-        $this->num = 0;
-    }
-    function valid() {
-        return $this->num < $this->obj->max;
-    }
-    function key() {
-        return $this->num;
-    }
-    function current() {
-        switch($this->num) {
-            case 0: return "1st";
-            case 1: return "2nd";
-            case 2: return "3rd";
-            default: return $this->num."th";
-        }
-    }
-    function next() {
-        $this->num++;
-    }
-}
-
-class Object implements IteratorAggregate {
-
-    public $max = 3;
-
-    function getIterator() {
-        return new ObjectIterator($this);
-    }
-}
-
-$obj = new Object;
-
-// this foreach ...
-foreach($obj as $key => $val) {
-    echo "$key = $val\n";
-}
-
-// matches the following 7 lines with the for directive.
-$it = $obj->getIterator();
-for($it->rewind(); $it->valid(); $it->next()) {
-    $key = $it->current();
-       $val = $it->key();
-          echo "$key = $val\n";
-}
-unset($it);
-?>
-]]>
-     </programlisting>
-    </example>
-   </section>
-    
-   <section id='migrating5.oop.methodconst'>
-    <title><literal>__METHOD__</literal> constant</title>
-    <para>
-     The new <literal>__METHOD__</literal> pseudo constant shows the current
-     class and method when used inside a method and the function when used outside
-     of a class.
-    </para>
-    <example>
-     <title><literal>__METHOD__</literal> use example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class Foo {
-    function show() {
-        echo __METHOD__;
-    }
-}
-
-class Bar extends Foo {
-}
-
-Foo::show(); // outputs Foo::show
-Bar::show(); // outputs Foo::show either since __METHOD__ is
-             // compile-time evaluated token
-
-function test() {
-    echo __METHOD__;
-}
-
-test();      // outputs test
-?>
-]]>
-     </programlisting>
-    </example>
-   </section>
-  
-   <section id='migrating5.oop.tostring'>
-    <title><function>__toString</function> method</title>
-    <para>
-     The new <function>__toString</function> magic method allows you to
-     overload the object to string conversion.
-    </para>
-    <example>
-     <title><function>__toString</function> example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class Foo {
-    function __toString() {
-        return "What ever";
-    }
-}
-
-$obj = new Foo;
-
-echo $obj; // call __toString()
-?> 
-]]>
-     </programlisting>
-    </example>
-   </section>
-
-   <section id='migrating5.oop.reflection'>
-    <title>Reflection API</title>
-    <para>
-     PHP 5 comes with a complete reflection API that adds the ability to
-     reverse-engineer classes, interfaces, functions and methods as well as
-     extensions.
-    </para>
-    <para>
-     The reflection API also offers ways of getting doc comments for
-     functions, classes and methods. 
-    </para>
-    <para>
-     Nearly all aspects of object oriented code can be reflected by using the
-     reflection API which is 
-     <ulink 
url="http://sitten-polizei.de/php/reflection_api/docs/language.reflection.html";>
-     documented separately</ulink>.
-    </para>
-    <example>
-     <title>Reflection API use example</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class Foo {
-    public $prop;
-    function Func($name) {
-        echo "Hello $name";
-    }
-}
-
-reflectionClass::export('Foo');
-reflectionObject::export(new Foo);
-reflectionMethod::export('Foo', 'func');
-reflectionProperty::export('Foo', 'prop');
-reflectionExtension::export('standard');
-?> 
-]]>
-     </programlisting>
-    </example>
-   </section>
-
   </section>
 
   <section id='migrating5.errorrep'>

Reply via email to