PHP开发实例大全(提高卷) 中文完整pdf扫描版[244MB]
现在开发中经常使用序列号和反序列化技术手段,php开发中也大量使用到。如下几个知名系统都使用了大量的序列化技术
ecshop
2. phpcms内容管理系统
3.laravel框架
一、序列号的目的?
方便数组和对象的传输或存储,同时不丢失其类型和结构
如下是ecshop中对支付配置信息序列化serialize($pay_config)之后更新到数据库存储
$pay_config = serialize($pay_config); /* 安装,检查该支付方式是否曾经安装过 */ $sql = "SELECT COUNT(*) FROM " . $ecs->table('payment') . " WHERE pay_code = '$payment'"; if ($db->GetOne($sql) > 0) { $sql = "UPDATE " . $ecs->table('payment') . " SET pay_config = '$pay_config'," . " enabled = '1' " . "WHERE pay_code = '$payment' LIMIT 1"; $db->query($sql); }
二、对象的序列化
首先定义3个文件
user.php //用户类
serialize.php //引入user.php类文件,初始对象,并且序列化对象
unserialize.php //引入user.php类文件,进行反序列化操作,然后调用对象中的变量或方法试一试
文件 | user.php | serialize.php | unserialize.php |
代码 | class userinfo{ public $name = ''; public $age = 0; public function setName($n){ $this->name = $n; } public function getName(){ echo $this->name; } } | include 'user.php'; $user = new User(); $user->age = 10; $user->name = 'lizhenghua'; $u = '重新安名字'; $user->setName($u); $user->getName(); $u = serialize($user); file_put_contents('store',$u); | include 'user.php'; $s = file_get_contents('store'); $user = unserialize($s); echo $user->age; //调用age属性 $user->getName(); //调用getName()方法 var_dump($user); //输出$user对象看看 |
结果 | 输出$user->age的结果:10 调用$user->getName()的结果:重新安名字 object(userinfo)#1 (2) { ["name"]=> string(15) "重新安名字" ["age"]=> int(10) } |
结果说明:
unserialize.php中
1 . 输出$user->age的结果:10 执行原理是对 O:8:"userinfo":2:{s:4:"name";s:15:"重新安名字";s:3:"age";i:10;}反序列化对象字符串之后执行的
2. 调用$user->getName()的结果:重新安名字 执行原理是反序列化之后重新实例化对象,在调用对象中的方法
原因:unserialize.php中执行var_dump($user); 发现对象被序列化处理只保存了所有的变量,但不会保存对象的方法,只会保存类的名称
php手册说明:
所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
为了能够unserialize()一个对象,这个对象的类必须已经定义过。如果序列化类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。 如果要想在另外一个文件中解序列化一个对象,这个对象的类必须在解序列化之前定义,可以通过包含一个定义该类的文件或使用函数spl_autoload_register()来实现。
在应用程序中序列化对象以便在之后使用,强烈推荐在整个应用程序都包含对象的类的定义。 不然有可能出现在解序列化对象的时候,没有找到该对象的类的定义,从而把没有方法的类__PHP_Incomplete_Class_Name作为该对象的类,导致返回一个没有用的对象。
三、数组序列化和反序列话
/**
* 数组序列化,这里只是简单演示一下,实际项目中数组序列化之后存储在数据库,在调用的地方反序列输出
*/
$arr = array('li','wang','ba'); print_r($arr); $a = serialize($arr); print_r($a); $new_a = unserialize</a>($a); print_r($new_a);
转载请注明:谷谷点程序 » php 对象和数组序列化 serialize()返回字符串方便存储和传递 unserialize()反序列化 不丢失类型和结构