PHP序列化、反序列化常用的魔术方法

__wakeup() //使用unserialize时触发
__sleep() //使用serialize时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当脚本尝试将对象调用为函数时触发

特别好的简单案例:

<?php  
//初始化一个类  
class User{  
//类的成员属性  
private $name;  
private $age;  
private $sex;  
//构造函数  
function __construct($pname,$page,$psex){  
$this->name=$pname;  
$this->age=$page;  
$this->sex=$psex;  
}  
//设置魔术方法__sleep()  
/* 
功能:返回一个数组,选择是全部序列化还是部分成员属性序列化,如果没有该函数就表示全部序列化 
在序列化的时候自动调用这个方法 
*/  
function __sleep(){  
return array('name');   //返回一个只序列化name属性的数组  
}  
function __wakeup(){  
$this->name='Yue';  
//$this->age=23;  
}  
}//the end of the class  
$u=new User('Androidyue',22,'Man');//实例化一个对象  
//file_put_contents('notepad1.txt',serialize($u));//序列化$u对象并且将信息存放在notepad1.txt文件中  
//获取序列化的文件信息  
$str=file_get_contents('notepad1.txt');  
//对文件进行反序列化  
$uu=unserialize($str);  
//输出对象的信息  
var_dump($uu);//结果:object(User)#2 (3) { ["name:private"]=> string(3) "Yue" ["age:private"]=> NULL ["sex:private"]=> NULL }  
?>  

1.__construct()

  类一执行就开始调用,其作用是拿来初始化一些值。

2.__desctruct()

  类执行完毕以后调用,其最主要的作用是拿来做垃圾回收机制。

3.__get()

  方法用于获取私有属性值。(在设置私有属性的时候将会自动调用)【http://www.cnblogs.com/xishaonian/p/6170459.html】

4.__set()

  在对象访问私有成员的时候自动被调用,达到了给你看,但是不能给你修改的效果!(在对象访问一个私有的成员的时候就会自动的调用该魔术方法)【http://www.cnblogs.com/xishaonian/p/6170459.html】

5.__isset()

  方法用于检测私有属性值是否被设定。(当外部使用isset读类内部进行检测对象是否有具有某个私有成员的时候就会被自动调用!)【http://www.cnblogs.com/xishaonian/p/6170459.html】

6.__unset()

  方法用于删除私有属性。(在外部调用类内部的私有成员的时候就会自动的调用__unset魔术方法)【http://www.cnblogs.com/xishaonian/p/6170459.html】

7.__toString()

  在对象当做字符串的时候会被调用。

<?php    
     
class TestClass    
{    
    // 一个变量 
    public $variable = 'This is a string'; 
    // 一个简单的方法
    public function PrintVariable()    
    {    
        echo $this->variable . '<br />';    
    }  
    // Constructor
    public function __construct()    
    {    
        echo '__construct <br />';    
    }    
    // Destructor 
    public function __destruct()    
    {    
        echo '__destruct <br />';    
    }    
    // Call 
    public function __toString()    
    {    
        return '__toString<br />';    
    }    
}    
// 创建一个对象    
//  __construct会被调用
$object = new TestClass();   
// 创建一个方法     
$object->PrintVariable();  
// 对象被当作一个字符串    
//  __toString会被调用   
echo $object;    
// End of PHP script    
// 脚本结束__destruct会被调用  
?> 
输出效果如下:
__construct 
This is a string
__toString
__destruct 

  

8.__sleep()

  在对象被序列化的过程中自动调用。sleep要加数组  

<?php 
class test
{
    public $username;
    function admin()
    {
        print "_this is admin function<br/>";
    }
    function __sleep()
    {
       print "this is __sleep function";
    }
}
$a = new test();
$a ->admin();
echo @serialize($a);
 ?>
输出效果:
_this is admin function
this is __sleep functionN;

9.___call() 当所调用的成员方法不存在(或者没有权限)该类时调用,用于对错误后做一些操作或者提示信息

10.__wakeup()函数 该魔术方法在反序列化的时候自动调用,为反序列化生成的对象做一些初始化操作

11.

原文地址:https://www.cnblogs.com/nul1/p/8646034.html