php函数serialize()与unserialize()用法实例
本文实例讲述了php函数serialize()与unserialize()用法。分享给大家供大家参考。具体方法如下:
该实例主要讲述了php函数serialize()与unserialize()说明及案例。想要将已序列化的字符串变回PHP的值,可使用unserialize()。serialize()可处理除了resource之外的任何类型。甚至可以serialize()那些包含了指向其自身引用的数组。你正serialize()的数组/对象中的引用也将被存储。
serialize()返回字符串,此字符串包含了表示value的字节流,可以存储于任何地方。这有利于存储或传递PHP的值,同时不丢失其类型和结构。
想要将已序列化的字符串变回PHP的值,可使用unserialize()。serialize()可处理除了resource之外的任何类型。甚至可以serialize()那些包含了指向其自身引用的数组。你正serialize()的数组/对象中的引用也将被存储。
当序列化对象时,PHP将试图在序列动作之前调用该对象的成员函数__sleep()。这样就允许对象在被序列化之前做任何清除操作。类似的,当使用unserialize()恢复对象时,将调用__wakeup()成员函数。
注:在PHP3中,对象属性将被序列化,但是方法则会丢失。PHP4打破了此限制,可以同时存储属性和方法。请参见类与对象中的序列化对象部分获取更多信息。
serialize()和unserialize()在php手册上的解释是:
serialize—Generatesastorablerepresentationofavalue
serialize—产生一个可存储的值的表示
unserialize—CreatesaPHPvaluefromastoredrepresentation
unserialize—从已存储的表示中创建PHP的值
serialize,翻译过来叫“连载,使连续”,通常称它为“序列化”
这个函数很好用,特别是和unserialize一起配合使用
我觉得比较有用的地方就是将数据存入数据库或记录在文件中的时候
当然这种数据必须是比较复杂的(不复杂也不需要serialize了,我觉得起码得是一个一数组),而且是数据库中的非“索引或主键”,当然最好这个数据库字段在系统中和任何搜索程序无关,当然serialize后的数据其实还是能够搜索的,因为具体的数据并没有被加密或改变
<?php //简单一点的 $array=array(); $array['key']='website'; $array['value']='www.isoji.org'; $a=serialize($array); echo$a; unset($array); $a=unserialize($a); print_r($a);
//声明一个类 classdog{ var$name; var$age; var$owner; functiondog($in_name="unnamed",$in_age="0",$in_owner="unknown"){ $this->name=$in_name; $this->age=$in_age; $this->owner=$in_owner; } functiongetage(){ return($this->age*365); }
functiongetowner(){ return($this->owner); }
functiongetname(){ return($this->name); } } //实例化这个类 $ourfirstdog=newdog("Rover",12,"LisaandGraham"); //用serialize函数将这个实例转化为一个序列化的字符串 $dogdisc=serialize($ourfirstdog); print$dogdisc;//$ourfirstdog已经序列化为字符串O:3:"dog":3:{s:4:"name";s:5:"Rover";s:3:"age";i:12;s:5:"owner";s:15:"LisaandGraham";} print'<BR>'; /* 在这里你可以将字符串$dogdisc存储到任何地方如session,cookie,数据库,php文件 */ //我们在此注销这个类 unset($ourfirstdog); /*还原操作*/ /* 在这里将字符串$dogdisc从你存储的地方读出来如session,cookie,数据库,php文件 */
//我们在这里用unserialize()还原已经序列化的对象 $pet=unserialize($dogdisc);//此时的$pet已经是前面的$ourfirstdog对象了 //获得年龄和名字属性 $old=$pet->getage(); $name=$pet->getname(); //这个类此时无需实例化可以继续使用,而且属性和值都是保持在序列化之前的状态 print"Ourfirstdogiscalled$nameandis$olddaysold<br>"; print'<BR>'; ?>