时间:2021-07-01 10:21:17 帮助过:21人阅读
对一个对象进行序列化,只能将其属性数据“保存起来”,而方法被忽略(方法不是数据)
对象在序列化时,会自动调用该对象所属类的魔术方法:sleep()
对象的反序列化:
对一个对象进行反序列化,其实就是恢复期原来保存起来的属性数据,而且此时必然需要依赖该对象原本的所属类。
对象在反序列化的时候,会自动调用该对象所属类的魔术方法:wakeup()
将指定的类对象串行化 $str=serialize($per) //将per对象串行化,结果返回给$str
序列化做法:
$v1 = 123; //这是一个变量,代表任意的内存数据$s1 = serialize( $v1 ); //将任何类型的变量数据,转换为“字符串” file_put_contents( '要保存的目标文本文件', $s1 ); //将该字符串,保存到一个文件里(就是硬盘数据)
反串行化,返回结果是对象 $per=unserialize($str);
反序列化做法:
$s1 = file_get_contens( '保存序列化数据的目标文本文件' ); //从一个文件里读出其中的所有字符 $v1 = unserialize($s1); //将该字符串数据,反序列化转换为变量(数据)
序列化和反序列化的例子
<?phpclass Person{
var $name;
var $sex;
var $age;
function construct($name = "", $sex = "", $age = "") {
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
} function say() {
echo "我的名字叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
}
}$p1 = new Person("张三", "男", 20);$p1_string = serialize($p1); //把一个对象串行化,返一个字符串
echo $p1_string . "<br>";
//串行化的字符串我们通常不去解析//将$p1_string存储到文件file.txt中file_put_contents('./file.txt', $p1_string);
$p2 = unserialize($p1_string); //把一个串行化的字符串反串行化形成对象
$p2$p2->say();//下面的做法和上面效果一样
$p3_file = file_get_contents('./file.txt'); //读取文件
$p3 = unserialize($p3_file); //反序列化
$p3->say();?>上例输出结果:
O:6:"Person":3:{s:4:"name";s:4:"张三";s:3:"sex";s:2:"男";s:3:"age";i:20;}我的名字叫:张三 性别:男 我的年龄是:20串行化某对象的部分属性。
反串行化时,初始化(其实是修改)对象内容
在PHP5中有两个魔术方法sleep()方法和wakeup()方法,在对象串行化的时候,会调用一个sleep()方法来完成一 些睡前的事情;而在重新醒来,即由二进制串重新组成一个对象的时候,则会自动调用PHP的另一个函数wakeup(),做一些对象醒来就要做的动作。sleep()函数不接受任何参数, 但返回一个数组,其中包含需要串行化的属性。末被包含的属性将在串行化时被忽略,如果没有sleep()方法,PHP将保存所有属性。
<?class Person{
var $name;
var $sex;
var $age;
function construct($name = "", $sex = "", $age = "") {
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
} function say() {
echo "我的名字叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
} //指定串行化时把返回的数组中$name和$age值串行化,忽略没在数组中的属性$sex
function sleep() {
$arr = array("name", "age"); // 此时,属性$sex将被删除!!!
return($arr);
} //重新生成对象时,并重新赋值$age为40
function wakeup() {
$this->age = 40;
}
}$p1 = new Person("张三", "男", 20);//把一个对象串行化,返一个字符串,调用了sleep()方法,忽略没在数组中的属性
$sex$p1_string = serialize($p1);
echo $p1_string . "<br>"; //串行化的字符串我们通常不去解析
$p2 = unserialize($p1_string); //反串行化形成对象$p2重新赋值
$age为40
$p2->say();?>上例输出为:
O:6:"Person":2:{s:4:"name";s:4:"张三";s:3:"age";i:20;}我的名字叫:张三 性别: 我的年龄是:40以上就是PHP面向对象-对象串行化serialize(),__sleep(),__wakeup() 的代码详解的详细内容,更多请关注Gxl网其它相关文章!