PHP魔术方法合集

  PHP 将所有以“__”(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以“__”为前缀。
魔术方法描述
__construct()初始化一个对象时触发;
__destruct()对象销毁,或者脚本执行完时触发;
__autoload()当使用一个不可访问的类时触发;
__clone()对象被克隆时触发;
__get()获取一个不可访问(属性不存在、或者无权限)的属性时触发;
__set()为一个不可访问的属性赋值的时候触发;
__isset()当用isset()函数判断一个不可访问的属性时触发;
__unset()当用unset()函数操作一个不可访问的属性时触发;
__call()当调用一个不可访问的方法时触发;
__callStatic()当调用一个不可访问的静态方法时触发;
__toString()当一个对象被当做字符串来操作时触发;
如$obj是一个对象,echo $obj,就会触发__toString();
__invoke()当一个对象被当做函数来使用时触发;
如$obj是一个对象,$obj()就会触发__invoke();
__sleep()在将使用serialize时触发;
__wakeup()在使用unserialize后触发;
__set_state()当调用var_export()导出类时触发(PHP 5.1.0起);
__debugInfo() 当调用var_dump()导出一个对象时调用(PHP 5.6.0起);
 
用法演示:
1、__autoload()魔术方法:
__autoload()是我们最为常用的魔术方法,常常用于自定加载类文件,做到按需加载:
<?php
//爱E族 aiezu.com
function __autoload($class) {
    if (class_exists($class, false)) return;
    $file = sprintf("./class/%s.php",  str_replace('_', DIRECTORY_SEPARATOR, $class));
    require_once($file);
}
// 当类Core_Db不存在时,自动引入类文件:./class/Core/Db.php
$db =  new Core_Db();
 
2、__debugInfo()魔术方法:
<?php
class Aiezu {
    private $name;
    public function __construct($name) {
        $this->name = $name;
    }
    public function __debugInfo() {
        return array('SiteName'=> $this->name);
    }
}
var_dump(new Aiezu('爱E族'));
​PHP 5.6.0以下版本运行结果:
object(Aiezu)#1 (1) {
  ["name":"Aiezu":private]=>
  string(7) "爱E族"
}
PHP 5.6.0以上版本运行结果:
object(Aiezu)#1 (1) {
  ["SiteName"]=>
  string(7) "爱E族"
}
 
3、__sleep()魔术方法:
<?php
class Aiezu {
    private $name;
    private $url = 'aiezu.com';
    public function __construct($name) {
        $this->name = $name;
    }
    public function __sleep() {
        return array('url'); //指定要序列化的属性列表
    }
}
echo serialize(new Aiezu('爱E族'));
输出:
O:5:"Aiezu":1:{s:10:"Aiezuurl";s:9:"aiezu.com";}

0 个评论

要回复文章请先登录注册