文档章节

PHP 对象的存储与传输(序列化 serialize 对象)

雪之丞
 雪之丞
发布于 2014/01/02 16:13
字数 857
阅读 492
收藏 6

对象的存储与传输

在实际项目应用中,有些任务在一两个页面是无法完成的,由于变量到脚本执行完毕就释放,我们在本页所产生的对象想在其他页面使用时就碰到了麻烦。

如果需要将对象及其方法传递带我们想使用对象的页面比较简单可行的办法是将对象序列化后存储起来或直接传输给需要的页面;另一种办法是将对象注册为session变量。

序列化对象

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

2 何时需要对对象实现序列化? 当我们需要把一个对象在网络中传输时或者要把对象写人文件或者数据库时,就需要将对象进行序列化。

3 如何将对象序列化? 序列化完整过程包括两个步骤: 一、序列化,就是把对象转化为二进制的字符串,serialize()函数用于序列化一个对象; 二、反序列化,就是把对象被序列化转化的二进制字符串在转化为对象,unserialize()函数用来反序列化一个被序列化的对象。 这个过程下来,对象内的类型结果及数据都是完整的。

4 示例:

<!-- lang: php -->
<?php 
<!-- lang: php -->
class Person{
<!-- lang: php -->
	private $name;
<!-- lang: php -->
	private $age;
<!-- lang: php -->

<!-- lang: php -->
	function __construct($name, $age){
<!-- lang: php -->
		$this->name = $name;
<!-- lang: php -->
		$this->age = $age;
<!-- lang: php -->
	}
<!-- lang: php -->

<!-- lang: php -->
	function say(){
<!-- lang: php -->
		echo "My name is : ".$this->name."\n";
<!-- lang: php -->
		echo "My age is : ".$this->age."\n";
<!-- lang: php -->
	}
<!-- lang: php -->
}
<!-- lang: php -->

<!-- lang: php -->
$p1 = new Person("ZhangSan", 20);
<!-- lang: php -->
$p1_string = serialize($p1);
<!-- lang: php -->

<!-- lang: php -->
$fh = fopen("../file/p1.txt", "w");
<!-- lang: php -->
fwrite($fh, $p1_string);
<!-- lang: php -->
fclose($fh);
<!-- lang: php -->

<!-- lang: php -->
?>

通常不去直接解析上述序列化生成的字符。反序列化示例:
<!-- lang: php -->
<?php 
<!-- lang: php -->
class Person{
<!-- lang: php -->
	private $name;
<!-- lang: php -->
	private $age;
<!-- lang: php -->

<!-- lang: php -->
	function __construct($name, $age){
<!-- lang: php -->
		$this->name = $name;
<!-- lang: php -->
		$this->age = $age;
<!-- lang: php -->
	}
<!-- lang: php -->

<!-- lang: php -->
	function say(){
<!-- lang: php -->
		echo "My name is : ".$this->name."\n";
<!-- lang: php -->
		echo "My age is : ".$this->age."\n";
<!-- lang: php -->
	}
<!-- lang: php -->
}
<!-- lang: php -->

<!-- lang: php -->
$p2 = unserialize(file_get_contents("../file/p1.txt"));
<!-- lang: php -->
$p2->say();
<!-- lang: php -->

<!-- lang: php -->
?>

5 注意: (1)由于序列化对象不能序列化其方法,所以在unserialize的时候,当前文件必须包含对应的类或者require对应的类文件。 (2)序列化只能用于有限用户的情况下,因为需要为每个用户单独存储或写入文件,且保证文件名不重复。在用户不能正常退出浏览器的情况下,不能保证文件被删除。

对象注册为session变量

当用户量很多时,可以考虑session来保存对象。

1 示例:

<!-- lang: php -->
<?php 
<!-- lang: php -->
session_start();
<!-- lang: php -->
class Person{
<!-- lang: php -->
	private $name;
<!-- lang: php -->
	private $age;
<!-- lang: php -->

<!-- lang: php -->
	function __construct($name, $age){
<!-- lang: php -->
		$this->name = $name;
<!-- lang: php -->
		$this->age = $age;
<!-- lang: php -->
	}
<!-- lang: php -->

<!-- lang: php -->
	function say(){
<!-- lang: php -->
		echo "My name is : ".$this->name."\n";
<!-- lang: php -->
		echo "My age is :".$this->age."\n";
<!-- lang: php -->
	}
<!-- lang: php -->
}
<!-- lang: php -->

<!-- lang: php -->
$_SESSION['p1'] = new Person('ZhangSan', 20);
<!-- lang: php -->
$_SESSION['p1'] -> say();
<!-- lang: php -->
?>

2 注意

与序列化一样,注册对象session变量不能保存其方法,所以在读取session变量的时候,当前文件必须包含对应的类或者require对应的类文件。

本文转载自:http://www.5idev.com/p-php_object_serialize.shtml

共有 人打赏支持
雪之丞
粉丝 13
博文 219
码字总数 51065
作品 0
浦东
程序员
PHP 序列化变量的 4 种方法

序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。 1. s...

mickelfeng
2013/01/12
0
1
PHP多种序列化/反序列化的方法

序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。 1. s...

cnu2m
2012/11/08
0
0
PHP多种序列化以及反序列化

PHP多种序列化以及反序列化 PHP点点通2016-09-2147 阅读 序列化PHP 序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个...

PHP点点通
2016/09/21
0
0
php函数serialize()与unserialize()

php函数serialize()与unserialize()说明及案例。想要将已序列化的字符串变回 PHP 的值,可使用unserialize()。serialize()可处理除了resource之外的任何类型。甚至可以serialize()那些包含了...

晨曦之光
2012/03/09
75
0
php函数 serialize()和unserialize()

php函数:序列化函数——serialize()与反序列化函数——unserialize()说明及案例。 serialize()返回字符串,此字符串包含了表示value的字节流,可以存储于任何地方。这有利于存储或传递 PHP ...

Claire_level
2012/06/09
0
1

没有更多内容

加载失败,请刷新页面

加载更多

win10下端口被占用解决办法

win10下端口被占用解决办法 昨天还好好的tomcat,今天启动时候发现tomcat无法启动,看报错信息显示8080端口被占用。 解决办法如下:按win+R输入cmd打开控制台,输入 netstat -ano|findstr 8...

DemonsI
2分钟前
0
0
yum apt chrome 常用软件的SOCKS 代理设置

yum 设置: 在/etc/yum.conf 增加一行,内容为: 在apt-get (apt) 上使用socks代理 chrome socks代理:

idoz
3分钟前
0
0
因 php 默认的 url encode 编码标准引发的一个问题

先看常用的校验请求合法性的一个方式 function createToken($params) { $secretKey = 'secretKey'; ksort($params); $query = http_build_query($params); $token = md5......

anoty
6分钟前
1
0
微信小程序页面栈管理

页面路由 在小程序中所有页面的路由全部由框架进行管理。 页面栈 框架以栈的形式维护了当前的所有页面。当发生路由切换的时候,页面栈的表现如下: 路由方式 页面栈表现 初始化 新页面入栈 ...

昙花一现
42分钟前
2
0
es6 let使用总结

中午偷个闲做个es6let的使用总结 作用域块 在作用域块中声明的变量不受外部的影响,见例子 {let a= 10;{let a= 20;console.log('子作用域', a);// 20}console.log('父作用域', a);// 10...

莫西摩西
44分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部