PHP5带来了强大的面向对象重载,允许程序员建立自定义的行为来访问属性和调用方法,php5加入了如下的魔法调用。

__construct
定义:void __construct([mixed $args[,$...]])
说明:构造函数,初始化类时调用
__destruct
定义:void __destruct(void)
说明:当对象不在被引用或php脚本运行时调用。

__get
定义:public mixed __get(string $name);    
说明:当无法访问或未定义要访问的对象的属性时,PHP会调用此方法,并将属性名作为参数传入。
__set
定义:public void __set(string $name,mixed $value);        
说明:当要设置的对象属性无法访问或未定义时,PHP会调用此方法,并将属性名和要设置的值作为参数传入。

__call
定义:public mixed __call(string $name,array $arguments);      
说明:当调用的对象的方法无法访问或未定义时,PHP会调用此方法,并将方法名和参数列表作为参数传入。
__callStatic
定义:public static mixed __callStatic(string $name,array $arguments);
说明:当调用的类的静态方法无法访问或未定义时,PHP会调用此方法,并将方法名和参数列表作为参数传入。PHP5.3.0版本加入。

__clone
定义:void __clone(void)
说明:当一个对象被cloned后,PHP将调用新对象的__clone方法。可以在该方法中对新对象的一些属性进行设置。 

__sleep
定义:public array __sleep(void)
说明:serialize将检测类中是否定义了__sleep方法,如果定义了,将先调用__sleep方法。
__wakeup
定义:public void __wakeup(void)
说明:unserialize将检测类中是否定义了__wakeup方法,如果定义了,再完成unserialize后调用该方法。

重载可以通过__get, __set, and __call几个特殊方法来进行. 当Zend引擎试图访问一个成员并没有找到时,PHP将会调用这些方法.

示例:
__get&__set

<?php
class foo {
function __set($name,$val) {
    print("Hello, you tried to put $val in $name");
}
function __get($name) {
    print("Hey you asked for $name");
}
}
$x = new foo();
$x->gettest= 3;//注意$gettest不存在
print($x->settest);
?>

__call

<?php
class foo {
function __call($name,$arguments) {
   print("Did you call me? I m $name!");
}
} $x = new foo();
$x->doStuff(2);
$x->fancy_stuff("a string");
?>

__clone

<?php
class MyCloneable {
static $id = 0;
function MyCloneable() {
    $this->id = self::$id+1; //注意这里如果写self::$id++;将不被充许
}
function __clone() {
    $this->address = "New York";
    $this->id = self::$id+1;
}
}
$obj = new MyCloneable();
$obj->name = "Hello";
$obj->address = "Tel-Aviv";
print $obj->id . "";
$obj =clone $obj;
print $obj->id . "";
print $obj->name . "";
print $obj->address . "";
?>

__sleep&__wakeup
 串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法.
当一个对象被串行化,PHP会调用__sleep方法(如果存在的话). 在反串行化一个对象后,PHP 会调用__wakeup方法. 这两个方法都不接受参数. __sleep方法必须返回一个数组,包含需要串行化的属性. PHP会抛弃其它属性的值. 如果没有__sleep方法,PHP将保存所有属性.
例子6.16显示了如何用__sleep和__wakeup方法来串行化一个对象. Id属性是一个不打算保留在对象中的临时属性. __sleep方法保证在串行化的对象中不包含id属性. 当反串行化一个User对象,__wakeup方法建立id属性的新值. 这个例子被设计成自我保持. 在实际开发中,你可能发现包含资源(如图像或数据流)的对象需要这些方法

<?php
class User
{
public $name;
public $id;
function __construct(){
    $this->id = uniqid();//give user a unique ID 赋予一个不同的ID
}
function __sleep(){
    return(array("name"));//do not serialize this->id 不串行化id
}
function __wakeup(){
    $this->id = uniqid();//give user a unique ID
}
}
 $u = new User;//create object 建立一个对象
$u->name = "Leon";
$s = serialize($u);//serialize it 串行化 注意不串行化id属性,id的值被抛弃
$u2 = unserialize($s);//unserialize it 反串行化 id被重新赋值
//$u and $u2 have different IDs $u和$u2有不同的ID
print_r($u);
print_r($u2);
?>