聊到php中的数组序列化操作,不得不提到PHP的序列化和反序列化函数,其中包括serialize() 和unserialize()。
Serialize() 函数是将变量序列化后获取字符串,也就是把数组层层存储的数据结构转化为可存储或可传输的字符串。反之,unserialize() 函数是将通过serialize()函数生成的字符串,还原为原本的数据结构。这种特殊的字符串,我们称之为serialize字符串。
想要进一步理解,可以看看以下的例子:
$array = array('name' =>'sam', 'age' =>25, 'city' =>'Beijing'); $serStr = serialize($array); echo $serStr; // output: a:3:{s:4:"name";s:3:"sam";s:3:"age";i:25;s:4:"city";s:7:"Beijing";}
在代码中,首先定义了一个关联数组:$array,数组中有三个元素:name,age和city,接着使用serialize()函数把数组转化为字符串,并将其打印出来。可以看到,输出了一个非常奇怪、杂乱无章的字符串,而这就是该数组被序列化之后的结果。
那么unserialize()函数“反序列化”,对于从serialize()函数返回的字符串反推回来最初的数据结构的操作过程如下所示:
$serStr = 'a:3:{s:4:"name";s:3:"sam";s:3:"age";i:25;s:4:"city";s:7:"Beijing";}'; $array = unserialize($serStr); print_r($array); // output: Array ( [name] =>sam [age] =>25 [city] =>Beijing )
unserialize方法接受一个 Serialize()方法输出的字符串输入。理论上unserialize()函数总是成功的,或者在不符合文本格式的情况下,触发一个E_NOTICE级别的错误。unserialize 函数不能创建实现的匿名类。使用 unserialize()可以安全地重新构造之前存储的对象。
我们还可以使用数组加序列的方式传递参数,下面是一个实际的代码示例:
$arr = array('first_name' =>'san', 'last_name' =>'tony', 'phone' =>array('123','456'), 'hobby' =>'music' ); echo serialize($arr); // a:4:{s:10:"first_name";s:3:"san";s:9:"last_name";s:4:"tony";s:5:"phone";a:2:{i:0;s:3:"123";i:1;s:3:"456";}s:5:"hobby";s:5:"music";}
在这个代码段中,我们定义了一个关联数组 $arr,数组中包含三个键值对。 注意数组中第三行的键 phone 其实是包含了两个值的数组,这个数组通过 serialize() 函数序列化后,可以看到输出的字符串中,有 a:2 表示数组中包含两个元素。
序列化是一个非常有用的特性,常用于缓存存储,网络传输等操作。然而,在一些场景下需要注意数组中的值的种类,可序列化数据类型包括: boolean,integer,float,string,array,object 和 NULL。传递给 unserialize 函数的字符串,应该不允许来自未受信任的源,以避免被植入恶意的处理程序。这个函数的使用最好规避掉来自未知和不可信的源。
以上是PHP中序列化操作的相关介绍,希望能对你有所帮助!