为什么要进行对象存储和传输?
一两个页面很多时候无法完成特定的功能,但是变量在脚本执行结束后自动释放了,我们在其他页面使用当前页面创建的对象时就遇到了难题。
为了传递对象以及对象的属性和方法到其他页面,我们就需要使用对象序列化将对象存储或传输。或者,使用将对象注册为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
PS:
1.由于序列化对象不能序列化其方法,所以在 unserialize 的时候,当前文件必须包含对应的类或者 require 对应的类文件。
2.序列化只能用于有限用户的情况下,因为需要为每个用户单独存储或写入文件,且保证文件名不能重复。在用户不能正常退出浏览器的情况下,不能保证文件被删除。
对象注册为session变量的例子
当用户数量很多时,可以考虑用 session 来保存对象。关于 session 的更多信息,请参见《PHP 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
PS:
与序列化一样,注册对象为 session 变量时并不能保存其方法,所以在读取 session 变量的时候,当前文件必须包含对应的类或者 require 对应的类文件。