文档章节

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

雪之丞
 雪之丞
发布于 2014/01/02 16:13
字数 857
阅读 496
收藏 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

共有 人打赏支持
上一篇: PHP类和对象
下一篇: PHP日期和时间
雪之丞
粉丝 13
博文 219
码字总数 51065
作品 0
浦东
程序员
私信 提问
PHP多种序列化/反序列化的方法

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

cnu2m
2012/11/08
0
0
PHP 序列化变量的 4 种方法

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

mickelfeng
2013/01/12
0
1
PHP多种序列化以及反序列化

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

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

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

Claire_level
2012/06/09
0
1
php的serialize和unserialize的用法

serialize -- 产生一个可存储的值的表示 描述 string serialize ( mixed value ) serialize() 返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方。 这有利于存储或传递 PH...

freedonn
2014/04/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TiDB 3.0 Beta Release Notes

2019 年 1 月 19 日,TiDB 发布 3.0 Beta 版,对应 master branch 的 TiDB-Ansible。相比 2.1 版本,该版本对系统稳定性、优化器、统计信息以及执行引擎做了很多改进。 TiDB 新特性 支持 Vi...

TiDB
3分钟前
0
0
从拼多多优惠券事件看到的一些反思

本文由云+社区发表 作者:颜国平 摘要:最近几年,电商行业飞速发展,各种创业公司犹如雨后春笋大量涌现,商家通过各种活动形式的补贴来获取用户、培养用户的消费习惯,即将到来的“ 购物狂欢...

腾讯云加社区
4分钟前
0
0
记录一次BUG

1: 请求注册页面时生成一个UUID, 并且将UUID隐藏在页面中并且添加到session中去。 2: 发送短信时获取手机号和UUID,将两者发送至服务器 3: 先判断UUID和session中UUID是否一致。 不一致就...

专业写BUG的程序员
9分钟前
0
0
阿里云漏洞提示:phpMyAdmin <=4.8.1 checkPageValidity函数缺陷可导致GETSHELL

如题: phpMyAdmin <=4.8.1 后台checkPageValidity函数缺陷可导致GETSHELL 即:checkPageValidity函数对外部输入过滤不严,可导致本地包含任意文件。进一步地攻击者可通过注入代码到特定文件...

408582708
9分钟前
0
0
PyTorch可视化理解卷积神经网络

摘要: 神经网络工具像一个黑匣子,无法知道它的中间是如何处理的。本文使用图片加代码的形式讲解CNN网络,并对每层的输出进行可视化,便于初学者理解,可以动手实践下哦! 如今,机器已经能...

阿里云官方博客
22分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部