现在开发中经常使用序列号和反序列化技术手段,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.phpserialize.phpunserialize.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);
print_r($new_a);