最新消息: 新版网站上线了!!!

php 对象和数组序列化 serialize()返回字符串方便存储和传递 unserialize()反序列化 不丢失类型和结构

现在开发中经常使用序列号和反序列化技术手段,php开发中也大量使用到。如下几个知名系统都使用了大量的序列化技术

  1. ecshop

4.jpg

2. phpcms内容管理系统

5.jpg

3.laravel框架

6.jpg

一、序列号的目的?

方便数组和对象的传输或存储,同时不丢失其类型和结构

如下是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>($a);
print_r($new_a);


转载请注明:谷谷点程序 » php 对象和数组序列化 serialize()返回字符串方便存储和传递 unserialize()反序列化 不丢失类型和结构