日期:2014-05-16  浏览次数:20443 次

PHP魔法方法/函数详解
引自:
http://blog.csdn.net/inqihoo/article/details/9235103

在php的语法中,有一些系统自带的方法名,均以双下划线开头,它会在特定的情况下被调用。即所谓的魔法函数。
只有当你已经为一个给定类定义了这些魔法方法时,它们才会起作用。还要注意,这些方法不能直接调用,而只能通过要截获的事件来调用。
它们在面向对向编程中起着至关重要的作用。所以个人觉得很有必要整理一下。下面就php的15个魔法函数做一个详细整理:

1. __construct() 和 __destruct()
__construct() 对象初始化时会调用此方法(对于内核而言是指初始化完成后调用此方法).此方法用得比较多。__destruct() 当对象销毁时会调用此方法.那么什么时候对象会销毁呢?一是用户主动销毁对象,二是当程序结束时由引擎自动销毁
[php] view plaincopy
class People {  
  
    protected $_alive;  
  
    public function __construct()  
    {  
        $this->_alive = true;   
        echo 'Birth'.PHP_EOL;  
    }  
  
    public function __destruct()  
    {  
        $this->_alive = false;  
        echo 'Die'.PHP_EOL;  
    }  
}  
  
//主动销毁对象  
$test = new Test();  
unset($test);  
sleep(1);  
  
//程序完成后自动销毁对象  
$test = new Test();  
sleep(1);  


2. __get() 和 __set()
面向对象编程中使用频率很高的两个方法.当设置和获取对象的属性不允许访问时性,此方法会被调用。一定注意是不存在或不允许被读写时才会被调用。
因此对于一个对象,其属性不确定时,用这两个方法效果很好。

__get($name) 获取对象不存在的属性或无法访问的属性时调用.$name表示要获取的属性名
__set($name, $value) 设置对象不存在的属性或无法访问的属性时调用.$name表示要设置的属性名,$value表示要设置的值.

//例如:我们可以构建一个不确定属性的数据记录类  
class Record {  
  
    protected $_data;   
  
    public function __get($name)  
    {  
        if (isset($this->_data[$name])) {  
            return $this->_data;  
        }  
        return false;  
    }  
  
    public function __set($name, $value)   
    {  
        $this->_data = $value;  
    }  
}  
  
$record = new Record();  
$record->name = 'andrew';  
echo 'My name is '.$record->name.PHP_EOL;  


3. __isset() 和 __unset()
这两个方法用得比较少些。当调用方法isset()判断对象是否存在某属性, 调用unset()注销某属性时。且当这些属性不存在或不可访问时,会分别调用__isset()和__unset()方法
与前面的__get()和__set()略同。都是某属性不存在或不可访问时被调用

__isset($name) 当调用方法isset()方法判断不可访问的类属性时调用.$name表示属性名.
__unset($name) 当调用方法unset()方法删除不可访问的类属性时调用.$name表示属性名.
//例如:  
class People {  
  
    public $name;  
  
    public $sex;  
  
    private $_age;  
  
    public function __construct($name, $sex, $age)  
    {  
        $this->name = $name;  
        $this->sex  = $sex;  
        $this->_age = $age;  
    }  
  
    public function __isset($name)  
    {  
        echo 'The property '.$name.' not exists'.PHP_EOL;  
    }  
  
    public function __unset($name)  
    {  
        echo 'The property '.$name.' can not be unset'.PHP_EOL;  
    }  
}  
  
$people = new People('andrew', 'male', 28);  
isset($people->name);  
isset($people->real_name);  
unset($people->_age);  


4. __call() 和 __callStatic()
前面,我们发现,在获取对象的属性时,如果此属性不存在会调用__get()方法。那么如果调用此对象的方法时,如果此方法不存在呢?php引擎会自动调用__call()方法。
同样,如果调用的是静态方法,且不存在时会调用__callStatic()方法。需要注意的是,__callStatic()使用时是一个静态方法,且仅在php5.3以上版本才支持.

__call($method, $args) 调用对象方法不存在或不允许被调用时此方法会被调用。$method表示调用的方法名,$args表示调用的参数
__callStatic($method, $args) 调用对象的静态方法不存在或不允许被调用时此方法会被调用。$method表示调用的方法名,$args表示调用的参数.
[php] view plaincopy
//例如:我们假定人只有跳走两种行为  
class People {  
  
    public function jump()  
    {  
        echo 'I can jump'.PHP_EOL;  
    }  
  
    public function walk()  
    {  
        echo 'I can walk'.PHP_EOL;  
    }  
  
    public function __call($method, $args)  
    {  
        echo 'I can not '.$method.PHP_EOL;  
    }  
  
    //此方法必须是静态方法,且在php5.3版本下可用  
    public static function __callStatic($method, $args)  
    {  
        echo 'We can not'.$method.PHP_EOL;  
    }  
}  
  
$people = new People();  
$people->jump();  
$people->walk();  
$people->fly();  
People::fly();  


5. __sleep() 和 __wakeup()
这两个方法,咋一看,就是睡觉和唤醒嘛。那跟对象有什么关系?有时候该用的时候也想不起来。其实,我们简单点记,在php中有一个让对象