PHP魔术方法合集
PHP 将所有以“__”(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以“__”为前缀。
用法演示:
1、__autoload()魔术方法:
__autoload()是我们最为常用的魔术方法,常常用于自定加载类文件,做到按需加载:
2、__debugInfo()魔术方法:
3、__sleep()魔术方法:
魔术方法 | 描述 |
---|---|
__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";}