在开发者保存 WordPress 的配置项时,比如在使用 update_option 的时候,序列化处理是非常有必要的,它可以把字符串,数组,或者对象直接存进去,WordPress 会自动对非标量进行序列化处理,需要用到的时候,只需要使用 get_option
函数取出数据即可,原本是数组,取出来还是数组,原来是对象,取出来依然是对象,非常方便。
WordPress 内置了几个序列化处理的函数,它们分别是:maybe_unserialize
、maybe_serialize
、is_serialized
、is_serialized_string
。从命名就能看出函数的作用,下面一起学习下。
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 提供了 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
向我爱水煮鱼大佬学习,笔记记录以便查阅。
评论 (1)