我们知道数据库只能存储数字,文本和日期这些类型的数据,那么将数组和对象直接存储到数据库最好的方法是序列化,PHP 提供了 serialize()
函数将数组或者对象转成序列化字符串:
$data = array( 'apple', 'banana', 'orange' );
echo serialize( $data );
// 输出结果:a:3:{i:0;s:5:"apple";i:1;s:6:"banana";i:2;s:6:"orange";}
但是 PHP 默认的 serialize()
和 unserialize()
函数有个问题,在序列化的时候,不会判断是否已经序列化过了,或者在序列化数组恢复成数组的时候,也不会判断这是不是序列化数组。
所以 WordPress 做了一些改进,创造了 maybe_serialize()
和 maybe_unserialize()
这两个函数,用法和 serialize()
和 unserialize()
一致。但是:
maybe_serialize()
在进行序列化的时候,如果要序列化的数组或对象已经被序列化过了,就不会再次进行序列化,直接返回已经序列化的字符串。maybe_unserialize()
也一样,如果已经是数组或者对象,直接返回,不再还原!为了判断是否为已经序列化,所以 WordPress 还有两个函数:
所以这两个函数一般这么用:
if ( is_serialized( $data ) ) {
if ( is_serialized_string( $data ) ) {
// do something
}
}
另外,很重要一点,但是 WordPress 已经把很多数据库的操作透明化了,存进去数组,取出来还是数组,非常方便:
比如存到 options 表(update_option
),保存数据到 post_meta 表(update_post_meta)都无需再次进行序列化。
同样从 options 表取出数据(get_option
),从 post_meta 表取出数据(get_post_meta
)也是无需再次反序列化的。
不过,自建表,存数组或者对象到单个字段里面,还是需要序列化的。就要用到这些函数了。