curt Mon Jul 19 23:51:38 2004 EDT
Modified files: /phpdoc/en/language/oop5 overloading.xml Log: The overloading methods and members documentation http://cvs.php.net/diff.php/phpdoc/en/language/oop5/overloading.xml?r1=1.1&r2=1.2&ty=u Index: phpdoc/en/language/oop5/overloading.xml diff -u phpdoc/en/language/oop5/overloading.xml:1.1 phpdoc/en/language/oop5/overloading.xml:1.2 --- phpdoc/en/language/oop5/overloading.xml:1.1 Sun Jul 11 08:33:25 2004 +++ phpdoc/en/language/oop5/overloading.xml Mon Jul 19 23:51:38 2004 @@ -1,11 +1,182 @@ <?xml version="1.0" encoding="iso-8859-1"?> -<!-- $Revision: 1.1 $ --> +<!-- $Revision: 1.2 $ --> <sect1 id="language.oop5.overloading"> <title>Overloading</title> + <para> - . + Both method calls and member accesses can be overloaded via the + __call, __get and __set methods. These methods will only be + triggered when your object or inherited object doesn't contain the + member or method you're trying to access. </para> + <sect2 id="language.oop5.overloading.members"> + <title>Member overloading</title> + + <methodsynopsis> + <type>void</type><methodname>__set</methodname> + <methodparam><type>string</type><parameter>name</parameter></methodparam> + <methodparam><type>mixed</type><parameter>value</parameter></methodparam> + </methodsynopsis> + <methodsynopsis> + <type>void</type><methodname>__get</methodname> + <methodparam><type>string</type><parameter>name</parameter></methodparam> + </methodsynopsis> + + <para> + Class members can be overloaded to run custom code defined in your class + by defining these specially named methods. The <varname>$name</varname> + parameter used is the name of the variable that should be set or retrieved. + The __set() method's <varname>$value</varname> parameter specifies the + value that the object should set set the <varname>$name</varname>. + </para> + + <example> + <title>overloading with __get and __set example</title> + <programlisting role="php"> +<![CDATA[ +<?php +class Setter { + public $n; + private $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> + <para> + Will output: + </para> + <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:private"]=> + array(3) { + ["a"]=> + int(101) + ["b"]=> + int(2) + ["c"]=> + int(3) + } +} +]]> + </screen> + + </example> + </sect2> + + <sect2 id="language.oop5.overloading.methods"> + <title>Method overloading</title> + + <methodsynopsis> + <type>mixed</type><methodname>__call</methodname> + <methodparam><type>string</type><parameter>name</parameter></methodparam> + <methodparam><type>array</type><parameter>arguments</parameter></methodparam> + </methodsynopsis> + + <para> + Class methods can be overloaded to run custom code defined in your class + by defining this specially named method. The <varname>$name</varname> + parameter used is the name as the function name that was requested + to be used. The arguments that were passed in the function will be + defined as an array in the <varname>$arguments</varname> parameter. + The value returned from the __call() method will be returned to the + caller of the method. + </para> + + <example> + <title>overloading with __call 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> + <para> + Will Output: + </para> + <screen role="php"> +<![CDATA[ + +Method test called: +array(4) { + [0]=> + int(1) + [1]=> + string(1) "2" + [2]=> + float(3.4) + [3]=> + bool(true) +} +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +]]> + </screen> + </example> + + </sect2> </sect1>