84911835 2019-10-19
序列化处理是 WordPress 的强项,比如在使用 update_option
的时候,可以把字符串,数组,或者对象直接存进去,WordPress 会自定化进行序列化处理,需要用到的时候,只需要使用 get_option
函数取出数据即可,原本是数组,取出来还是数组,原来是对象,取出来依然是对象,非常方便。
WordPress 是怎么做到的呢?这个就是 WordPress 自己定义了几个序列化处理的相关函数把序列化处理过程做的更简单:
首先 WordPress 扩展了 PHP 原生的 unserialize
和 serialize
函数,定义了 maybe_unserialize
和 maybe_serialize
函数。
maybe_unserialize( $original ); maybe_serialize( $data );
maybe_unserialize
是 WordPress 的反序列化函数,官方的解释是:Unserialize value only if it was serialized. 意思是它会首先会检测一下当前的字符串是不是序列化之后的字符串,是的话,它才使用 PHP 的 unserialize
函数进行反序列化,如果不是,则直接返回。
maybe_serialize
是 WordPress 的序列化函数,如果是普通字符串,则直接返回,如果 $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";}";
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("hello") ) ); // true var_dump( is_serialized_string( serialize("hello") ) ); // true