« 上一篇下一篇 »

序列化的变量和对象

序列化是将可以存在PHP变量或对象中的任何数据转换成字节流的处理过程,这个字节流可以存储在数据库中,或者通过URL在网页之间传递。如果不使用这个处理过程,很难存储和传递整个数组或对象的内容。

随着session(会话)控制的引入,序列化的作用有了一定的降低,数据的序列化现在可以使用会话控制来实现。事实上,为了将会话变量在HTTP请求之间存储,可以使用会话控制函数来序列化会话变量。

但是,我们可能还希望将PHP数组或对象保存到一个文件或数据库中。如果要这样做,就必须了解如何使用这个函数:serialize()和unserialize()。

可以按如下方式调用serialize()函数:
$serial-object =serialize($my-object);

如果希望知道序列化都完成了那些操作,可以通过查看序列化后返回的结果来获知。显而易见,它可以数组或对象的内容转换为字符串。

如:我们可以查看对一个简单的employee对象上执行序列化操作的结果。该对象的定义和初始化如下:
class  employee
{
   var $name;
   var $employee-id;
}
$this-emp =new employee;
$this-emp->name=’Fred’;
$this-emp->employee-id=5324;

如果对其进行序列化操作并显示到浏览器,其输出结果为:
O:8:”employee”:2:{s:4:”name”;”Fred”;s:11:”employee-id”;i:5324;}

可以很容易的看出原始对象保存到数据和序列化后数据之间的关系。

由于序列化后的数据只有文本,你可以将它写到数据库或其他位置。请注意,与往常的操作一样,应该使用mysql-real-escape-string()函数对将要写入数据库的数据进行处理,这样可以转移任何特殊字符。注意上述序列化字符串中的引号,我们就知道这是必要的。

要恢复原来的对象,可以调用unserialize()函数,如下所示:
$new-object =unserialize($serial-object);

显然,如果在将对象保存到数据库之前,调用addslashes()函数,那么也需要在反序列化字符串之前调用stripslashes()函数。

当序列化类或使用它们作为会话变量时需要注意一点:在PHP能够重新实例化一个类之前,它必须知道类的结构。所以,必须在调用session-start()或unserialize()函数之前包含该类的定义文件。

« 上一篇下一篇 »