霜天部落 | 关注LAMP高性能、高并发架构的设计与研究

关于PHP串行化和JSON

先来解释下串行化。简单来说,串行化就是将变量转换成字节流的过程。串行化的提出,有效的解决了对象的保存和传输的问题。举例来说,我在 JavaScript中建立了一个对象,我如果想将这个对象保存到服务器端的数据库中,那么我怎样进行操作呢,这个时候往往就用到了对象的串行化。

在 JavaScript的串行化中不得不提JSON,JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python, PHP等)。这些特性使JSON成为理想的数据交换语言。

人们通常将PHP串行化JSON和XML进行比较,二者都是将对象扁平化的一种手段。XML的特点是结构严谨,而JSON的特点则是简单易读、容易使用程序进行分析,因为它能够很简单的将一个对象转换为一个字符流的形式,例如下面列出的代码:

{“type”:”man”,”name”:”hanguo”,”age”:28}

我们通过JavaScript的求值函数,将JSON表达式进行运算,并返回值,用以获得一个对象,到这里,我想你一定会和我一样,对JSON格式的创造者的思维佩服不已吧。

关于PHP串行化

PHP为我们提供了两个函数,用来进行串行化和反串行化的操作,这两个函数分别是:serialize()和unserialize(),他们适用于PHP4和PHP5,下面分别进行讲解:

serialize() (PHP 4, PHP 5, PECL axis2:0.1.0-0.1.1)

serialize — 获得一个可存储的表述值

说明:string serialize ( mixed $value )

获得一个可存储的表述值

本函数用于无损的存储或者传递PHP变量值和结构。

如果需要将已经串行化的值转回PHP变量,可以使用unserialize()函数。

参数:value

即被串行化的表达式。serialize()处理除资源指针之外的所有类型,你甚至可以将含有指向自身元素的数组串行化。你串行化的含有循环指向的数组或者对象一样会被存储,其他的指向则会丢失。

当串行化对象时,PHP会尝试首先调用其成员函数__sleep()。这将允许对象在被串行化之前进行诸如最后的清理工作等。同样地,当使用unserialize()函数将对象恢复时,会调用成员函数__wakeup()。

返回值:返回一个可以被存储在任何地点的包含对象的字节流表达式的字符串。

unserialize() (PHP 4, PHP 5, PECL axis2:0.1.0-0.1.1)

unserialize — 从一个已存储的表达式中获得一个PHP变量值

说明:mixed unserialize ( string $str )

unserialize()获取一个简单类型的串行化变量并将其转换回PHP变量值。

参数:str

串行化后的字符串

如果被反串行化的变量是一个对象,则成功恢复该对象的结构后,PHP将自动尝试执行该对象的__wakeup()成员函数(如果其存在)。

unserialize_callback_func指令:你可以设定在此过程中呗执行的回调函数,如果某个未被定义的类应当在反串行化时被实例化(以避免获得一个不完全的对象“__PHP_Incomplete_Class”)。你可以使用php.ini,ini_set()或者.htaccess来定义“unserialize_callback_func”。当一个未被定义的类被实例化时,它会被调用。屏蔽这个特性只需将其设为空即可。

返回值:

返回转换后的数值,可能是布尔变量、实数、浮点数、字符串、数组或者对象。

假如传入的字符串不可以被反串行化,则返回FALSE,同时抛出NOTICE错误。

PHP与JSON

在PHP中,可以对JSON文本进行反串行化,也可以将PHP的对象串行化为JSON而非PHP风格的文本。这主要是靠json_decode和 json_encode两个函数来完成的,需要特别说明的是,这两个函数在PHP 5 >= 5.2.0中才被支持,如果你要编写运行在PHP4环境下的程序,那么这两个函数是不可以使用的。

json_decode函数

语法:mixed json_decode ( string $json [, bool $assoc] )

获取一个JSON编码文本,并且将其转换为PHP变量

参数:json

被JSON编码的文本

assoc

当为TRUE时,返回的值为联合数组

返回值:

返回一个对象,或者如果可选的assoc参数为TRUE,则一个联合数组将会被返回

json_encode函数

语法:string json_encode ( mixed $value )

该函数返回一个值的JSON表达式

参数:value

要被编码的值,可以为除resource外的任何类型参数

这个函数仅在UTF-8编码格式时起作用

返回值:当成功时返回编码后的JSON文本