php 魔术方法

一、构造函数和析构函数__construct()、__destruct()

1 子类中通过parent::__construct()、parent::__destruct()调用父类的构造和析构函数,且不能被pravite修饰。
2 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。脚本执行结束时;使用$obj=NULLunset()、exit()函数时。

二、__set()、__get()

//从一个难以访问的属性读取、赋值时分别调用__get()、__set()
//私有属性或没有初始化的属性
class A{
function __get($property){
echo $property;
}
function __set($property,$vale){
echo $property.":"$value;
}
}
$a = new A();
$a->name;
$a->age=10;

三、__isset() 、 __unset()

1 //和__set() __get()类似

四、__call()、__callStatic()

1 __call($fun_name,$args_arr) 当要调用的方法不存在或权限不足时,会自动调用__call 方法。
2 __callStatic($fun_name,$args_arr) 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。

五、__sleep()、__wakeup()

serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。
unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。

__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。不用返回数组。

六、__autoload()

 1 //自动加载类
 2 function __autoload($class_name){
 3 require_once $class_name."php";
 4 }
 5 //自动加载file.php
 6 $a = new file();
----------------------------------------------------------------------------- 8 //1、其他的自动加载方式 9 set_include_path("/www/ss/class/")//类路径 10 spl_autoload("file");//寻找/www/ss/class/file.php 11 $a = new file();
-----------------------------------------------------------------------------
12 //2、其他的自动加载方式 13 function loadfile($class_name){ 14 require $class_name.".php"; 15 } 16 spl_autoload_register("loadfile");//注册loadfile()作为__autoload的实现 17 $a = new file();

七、__set_state

自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。
本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性。

八、__toString()

__toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。

九、__invoke()

当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
class A{
function __invoke($v){
var_dump($v);
}
}
$a = new A();
//下面将调用__invoke()
$a(5);

 

posted @ 2017-03-08 22:30  S3c0ldW4ng  阅读(187)  评论(0编辑  收藏  举报