php对象的序列化与反序列化 PHP对象存储与传输

发布时间:2020-10-20编辑:脚本学堂
本文介绍下,在php编程中,有关php对象的存储与传输的知识,也就是php对象的序列化与反序列化的相关内容,有需要的朋友参考下吧。

本节内容:
php对象的序列化与反序列化

将对象及其方法传递到想使用对象的页面,简单可行的方法是这样:
将对象序列化后存储起来或直接传输给需要的页面。

另外一种办法:将对象注册为 session 变量。

一,序列化对象
对象序列化,就是将对象转换成可以存储的字节流。

当需要把一个对象在网络中传输时或者要把对象写入文件或是数据库时,就需要将对象进行序列化。
序列化完整过程包括两个步骤:一个是序列化,就是把对象转化为二进制的字符串,serialize() 函数用于序列化一个对象;
另一个是反序列化,就是把对象被序列转化的二进制字符串再转化为对象,unserialize() 函数来反序列化一个被序列化的对象。

如此,整个过程下来,对象内的类型结构及数据都是完整的。

语法:
string serialize( mixed value )mixed unserialize( string str [, string callback] )

例子:
 

复制代码 代码示例:

<?php
class Person {
private $name;
private $age;
function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}

function say() {
echo "我的名字叫:".$this->name."<br />";
echo " 我的年龄是:".$this->age;
}}

$p1 = new Person("张三", 20);
$p1_string = serialize($p1);//将对象序列化后写入文件
$fh = fopen("p1.text", "w");
fwrite($fh, $p1_string);
fclose($fh);
?>

打开 p1.text 文件,输入内容:
O:6:"Person":2:{s:12:" Person name";s:4:"张三";s:11:" Person age";i:20;}
但通常不去直接解析上述序列化生成的字符。

二,反序列化:
 

复制代码 代码示例:

<?php
class Person {
private $name;
private $age;
function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
function say() {
echo "我的名字叫:".$this->name."<br />";
echo " 我的年龄是:".$this->age;
}}

$p2 = unserialize(file_get_contents("p1.text"));
$p2 -> say();
?>
 

输出结果:
我的名字叫:张三我的年龄是:20
提示由于序列化对象不能序列化其方法,所以在 unserialize 时,当前文件必须包含对应的类或 require 对应的类文件。

序列化只能用于有限用户的情况下,因为需要为每个用户单独存储或写入文件,且保证文件名不能重复。
在用户不能正常退出浏览器的情况下,不能保证文件被删除。对象注册为 session 变量。
当用户数量很多时,可以考虑用 session 来保存对象。

有关session的更多信息,请参见文章:
php中session的简单例子
php session操作类(附实例)
php session函数集
php中session过期设置的方法详解
php中session的应用举例
php会话技术之Session用法举例
php注销session信息
php5中Cookie与Session用法

例子:
 

复制代码 代码示例:

<?php
session_start();
class Person {
private $name;
private $age;
function __construct($name, $age) {
$this->name = $name;
$this->age = $age; }
function say() {
echo "我的名字叫:".$this->name."<br />";
echo " 我的年龄是:".$this->age;
}}

$_SESSION["p1"] = new Person("张三", 20);
?>

读取 session :
 

复制代码 代码示例:

<?php
session_start();
class Person {
private $name;
private $age;
function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}

function say() {
echo "我的名字叫:".$this->name."<br />";
echo " 我的年龄是:".$this->age;
}}
$_SESSION["p1"] -> say();
?>
 

输出结果:
我的名字叫:张三我的年龄是:20
与序列化一样,注册对象为 session 变量时并不能保存其方法。
因此,在读取 session 变量时,当前文件必须包含对应的类或者 require 对应的类文件。