鲍成龙
幸福破灭之时,总是伴随着血腥味。
鲍成龙

序列化处理是 WordPress 的强项,比如在使用 update_option 的时候,可以把字符串,数组,或者对象直接存进去,WordPress 会自动对非标量进行序列化处理,需要用到的时候,只需要使用 get_option 函数取出数据即可,原本是数组,取出来还是数组,原来是对象,取出来依然是对象,非常方便。

WordPress 是怎么做到的呢?这个就是 WordPress 自己定义了几个序列化处理的相关函数把序列化处理过程做的更简单:

maybe_unserialize 和 maybe_serialize 函数

首先 WordPress 扩展了 PHP 原生的 unserialize 和 serialize 函数,定义了 maybe_unserialize 和 maybe_serialize 函数。

maybe_unserialize( $string );
maybe_serialize( $data );

maybe_unserialize 是 WordPress 提供的反序列化函数,官方的解释是:Unserialize value only if it was serialized. 相比 PHP 的 unserialize 函数,它会首先会检测传递进来的字符串是不是序列化之后的字符串,是的话,它才使用 PHP 的 unserialize 函数进行反序列化,如果不是,则直接返回。所以它的名字会有个 maybe

maybe_serialize 是 WordPress 的序列化函数,如果参数 $data 是普通字符串,则直接返回,如果 $data 是对象或者数组,则使用 PHP serialize 函数对齐进行序列化。

特别需要注意的是,如果 $data 是已经序列化的字符串,函数还会对其再进行一次序列化操作。

下面的例子比较全面解释其用法:

// 字符串不做任何处理,直接返回。
$data = 'Hello World!';
echo maybe_serialize( $data );
// Hello World!

// 整形,浮点型,和布尔型数据也是不做处理,直接返回。
$data = 55;
echo maybe_serialize( $data );
// 55

$data = 4.560
echo maybe_serialize( $data );
// 4.560

$data = true;
$data = maybe_serialize( $data );
// $data = true;

$data = null;
$data = maybe_serialize( $data );
// $data = null

// 对象和数组会被转换成序列化数据
$data = array( 1 => 'Hello World!', 'foo' => 'bar' );
echo maybe_serialize( $data );
// a:2:{i:1;s:12:"Hello World!";s:3:"foo";s:3:"bar";}

// 已经序列化的字符串,会被再次序列化
$data = 'a:2:{i:1;s:12:"Hello World!";s:3:"foo";s:3:"bar";}';
echo maybe_serialize( $data );
// s:50:"a:2:{i:1;s:12:"Hello World!";s:3:"foo";s:3:"bar";}";

is_serialized 和 is_serialized_string 函数

前面提到 WordPress 会判断字符串是不是序列化的字符串,这个是怎么实现的呢?

WordPress 提供了 is_serialized 和 is_serialized_string 这两个函数用来检测当前字符串是不是序列化字符串。

is_serialized( $data );

is_serialized_string( $data );

简单说:is_serialized 用法更广泛一点,无论数组,对象,字符串被序列化之后的字符串,它判断为 true,而 is_serialized_string 只有字符串被序列化之后,才判断为 true。下面的例子也非常全面的区分两者的区别:

var_dump( is_serialized( serialize(NULL) ) );		// true
var_dump( is_serialized_string( serialize(NULL) ) );	// false

var_dump( is_serialized( serialize(array(1,2,3)) ) );		// true
var_dump( is_serialized_string( serialize(array(1,2,3)) ) );	// false

var_dump( is_serialized( serialize(123) ) );		// true
var_dump( is_serialized_string( serialize(123) ) );	// false

var_dump( is_serialized( serialize(123) ) );		// true
var_dump( is_serialized_string( serialize(123) ) );	// false