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.
   All overloading methods must not be defined as
   static.
  
   Since PHP 5.1.0 it is also possible to overload the
   isset() and unset() functions via the
   __isset and __unset methods respectively.
  
void 
__set ( string name, mixed value )
mixed 
__get ( string name )
bool 
__isset ( string name )
void 
__unset ( string name )
    Class members can be overloaded to run custom code defined in your class
    by defining these specially named methods. The $name 
    parameter used is the name of the variable that should be set or retrieved.
    The __set() method's $value parameter specifies the 
    value that the object should set the $name.
   
| 例子 19-18. overloading with __get, __set, __isset and __unset example | 
<?phpclass Setter
 {
 public $n;
 private $x = array("a" => 1, "b" => 2, "c" => 3);
 
 private function __get($nm)
 {
 echo "Getting [$nm]\n";
 
 if (isset($this->x[$nm])) {
 $r = $this->x[$nm];
 print "Returning: $r\n";
 return $r;
 } else {
 echo "Nothing!\n";
 }
 }
 
 private function __set($nm, $val)
 {
 echo "Setting [$nm] to $val\n";
 
 if (isset($this->x[$nm])) {
 $this->x[$nm] = $val;
 echo "OK!\n";
 } else {
 echo "Not OK!\n";
 }
 }
 
 private function __isset($nm)
 {
 echo "Checking if $nm is set\n";
 
 return isset($this->x[$nm]);
 }
 
 private function __unset($nm)
 {
 echo "Unsetting $nm\n";
 
 unset($this->x[$nm]);
 }
 }
 
 $foo = new Setter();
 $foo->n = 1;
 $foo->a = 100;
 $foo->a++;
 $foo->z++;
 
 var_dump(isset($foo->a)); //true
 unset($foo->a);
 var_dump(isset($foo->a)); //false
 
 // this doesn't pass through the __isset() method
 // because 'n' is a public property
 var_dump(isset($foo->n));
 
 var_dump($foo);
 ?>
 | 
 上例将输出: | 
Setting [a] to 100OK!
 Getting [a]
 Returning: 100
 Setting [a] to 101
 OK!
 Getting [z]
 Nothing!
 Setting [z] to 1
 Not OK!
 
 Checking if a is set
 bool(true)
 Unsetting a
 Checking if a is set
 bool(false)
 bool(true)
 
 object(Setter)#1 (2) {
 ["n"]=>
 int(1)
 ["x:private"]=>
 array(2) {
 ["b"]=>
 int(2)
 ["c"]=>
 int(3)
 }
 }
 | 
 | 
mixed 
__call ( string name, array arguments )
    Class methods can be overloaded to run custom code defined in your class
    by defining this specially named method. The $name 
    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 $arguments parameter.
    The value returned from the __call() method will be returned to the
    caller of the method.
   
| 例子 19-19. overloading with __call example | 
<?phpclass Caller
 {
 private $x = array(1, 2, 3);
 
 public 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);
 ?>
 | 
 上例将输出: | 
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)
 }
 | 
 |