首页> 基础笔记 >PHP基础学习 >面向对象 面向对象
PHP对象串行化中的魔术方法__sleep( )和 __wakeup( )
作者:小萝卜 2019-09-03 【 PHP 面向对象 】 浏览 1257
简介__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)