时间: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网其它相关文章!