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

对象的存储与传输

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

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

序列化对象

1 什么是序列化?

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

2 何时需要对对象实现序列化?

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

3 如何将对象序列化?

序列化完整过程包括两个步骤:
    一、序列化,就是把对象转化为二进制的字符串,serialize()函数用于序列化一个对象;
    二、反序列化,就是把对象被序列化转化的二进制字符串在转化为对象,unserialize()函数用来反序列化一个被序列化的对象。

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

4 示例:


<?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 示例:


<?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对应的类文件。

你可能感兴趣的:(PHP 对象的存储与传输(序列化 serialize 对象))