文档章节

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

雪之丞
 雪之丞
发布于 2014/01/02 16:13
字数 857
阅读 494
收藏 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 序列化变量的 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

没有更多内容

加载失败,请刷新页面

加载更多

设计模式之单例模式

单例模式核心:保证一个类只有一个对象 单例模式分为五种:懒汉式、饿汉式、双重检测锁式、静态内部类式、枚举式 五种模式的特点:懒汉式---线程安全,调用效率高,不能延时加载 饿汉式---线...

森林之下
1分钟前
0
0
markdown语法

这篇博客是本人在使用markdown语法过程中,用于记录一些自己总是会忘记的语法,并且会持续更新; 如何增加批注/备注:>; 这是一条备注/引言 如何手动换行,行末两次空格;

BlackCanary
3分钟前
0
0
redis 设置外网可访问

前提是你已经把redis的端口放到了防火墙计划中,  /sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT /etc/rc.d/init.d/iptables save 更改redis.conf 文件 bind 127.0.0.1prot...

时刻在奔跑
4分钟前
0
0
css3隐藏滚动条

chrome 和Safari .element::-webkit-scrollbar { width: 0 } IE 10+ .element { -ms-overflow-style: none; } Firefox .element { overflow: -moz-scrollbars-none; } firefox这个没试过~啦啦......

呵呵闯
21分钟前
0
0
Poco官方PPT_020-ErrorHandlingAndDebugging双语对照翻译

因工作需要用到这一块的功能,所以直接翻译了一下 此PPT来源于官方文件,地址https://pocoproject.org/documentation.html

CHONGCHEN
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部