首页> 基础笔记 >PHP基础学习 >面向对象 面向对象

PHP对象串行化中的魔术方法__sleep( )和 __wakeup( )

作者:小萝卜 2019-09-03 浏览 881

简介__sleep(): 是执行串行化时自动调用的方法,目的是实现资源类型属性的关闭释放等操作。__wakeup():是在执行反串行化时自动调用的方法,目的是实现资源属性的打开(sleep方法关闭的资源),即再次初始化。

对象串行化中的魔术方法__sleep( )和 __wakeup( ) 

__sleep(): 是执行串行化时自动调用的方法,目的是实现资源类型属性的关闭释放等操作。

注意:sleep方法需要返回一个数组,其中数组中的值是串行化时要保留的属性名

__wakeup():是在执行反串行化时自动调用的方法,目的是实现资源属性的打开(sleep方法关闭的资源),即再次初始化。

如:
public function __sleep(){
        return array('server', 'username', 'password', 'db');
       //此串行化要保留四个属性
    }

实例1:

<?php
    class Person {                 //声明一个Person类,包含三个成员属性和一个成员方法
        public $name = "zhangsan";     	//人的名字
        public $sex = "man";       	//人的性别
        public $age = 20;      		//人的年龄
        public function say()  {               
              echo "我的名字:".$this->name.",性别:".$this->sex.".年龄:".$this->age."<br>";
        } 
        public function __sleep() {  //在类中添加此方法,在串行化时自动调用并返回数组        
            $arr = array("name", "age");  //数组中的成员$name和$age将被串行化,$sex则被忽略
            return($arr);                   //返回一个数组
        } 
        public function __wakeup() {  //在反串行化对象时自动调用该方法,没有参数没有返回值
             $this->age = 40;            //在重新组织对象时,为新对象中的$age属性重新赋值
        }
    }
    $person1 = new Person( );//通过Person类实例化对象,对象引用名为$person1
    $person_string = serialize($person1); //串行化,自动调用了__sleep()方法。忽略属性$sex
    echo $person_string."<br>";             //输出对象串行化的字符串
    $person2 = unserialize($person_string); //反串行化对象形成对象$p2重新赋值$age为40
    $person2 -> say();                      //调用新对象中say()方法输出的成员中已没有$sex属性了

实例2:
 

<?php
//对象的串行化
//serialize() -- 串行化
//unserialize() -- 反串行化


$f = new File("a.txt");

echo $f->myread(40)."<br/>"; //可以使用

$str = serialize($f); //将对象f串行化

$ob =  unserialize($str); //反串行化

echo $ob->myread(40);


//定义一个文件信息读取类
class File{
    private $filename;
    private $flink;
    private $p;
  
    public function __construct($filename){
        //初始化文件信息
        $this->filename = $filename;
        //打开文件
        $this->flink = fopen($filename,"r");
    }
    
    public function myread($m){
       return fread($this->flink,$m);
    }
    
    //串行化魔术方法
    public function __sleep(){
        $this->p = ftell($this->flink);
        return array("filename","p"); //返回串行化时要保留的属性
    }
    
    //反串行化
    public function __wakeup(){
        //重新打开这个文件
        $this->flink = fopen($this->filename,"r");
        fseek($this->flink,$this->p,SEEK_SET);//定位指针位置。
    }
}

很赞哦! (0)

上一篇:

下一篇:

文章评论

    高端网站建设