希望得到一个数组或对象的字符串表示,以便存储在一个文件或数据库中。
使用serialize()将变量及其值编码为一种文本形式:
// 定义一个数组,其中包含食品名称作为键,食品数量作为值
$pantry = array('sugar' => '2 lbs.', 'butter' => '3 sticks');
// 尝试以写入模式('w')打开一个名为'tmp/pantry'的文件。如果文件不存在,它将被创建。
// 如果文件打开失败,使用or运算符触发die函数,输出错误信息并停止脚本执行
$fp = fopen('tmp/pantry','w') or die("Can't open pantry");
// 使用serialize函数将$pantry数组转换成一个可存储或传输的字符串表示。
// serialize函数将数组或其他复杂数据类型转换成一个单一的字符串。
// 然后,使用fputs函数将这个序列化后的字符串写入到之前打开的文件中。
// fputs函数需要两个参数:文件指针($fp)和要写入的数据(serialize($pantry))。
// 串行化字符串:a:2:{s:5:"sugar";s:6:"2 lbs.";s:6:"butter";s:8:"3 sticks";}
fputs($fp,serialize($pantry));
// 关闭文件指针。这是一个好习惯,可以释放系统资源。
// 一旦文件被关闭,对文件的进一步操作(如写入)将不再可能,直到文件被重新打开。
fclose($fp);
要重新创建变量,可以使用unserialize():
//$new_pantry将是数组array('sugar' => '2 lbs.', 'butter' => '3 sticks');
//unserialize()反序列化
$new_pantry = unserialize(file_get_contents('/tmp/pantry'));
//为了更容易地与其他语言互操作(稍有些性能开销),可以使用json_encode()串行化数据:
//JSON编码的字符串:{"sugar:"2 lbs.", "butter": "3 sticks"}
$pantry = array('sugar' => '2 lbs.', 'butter' => '3 sticks');
$fp = fopen('tmp/pantry','w') or die("Can't open pantry");
fputs($fp,json_encode($pantry));
fclose($fp);
可以使用json_decode()重新创建变量:
$new_pantry = json_decode(file_get_contents('/tmp/pantry.json'), TRUE);
JSON无法区分串行化格式的对象和关联数组,所以调用时必须选择想要对象还是关联数组。
如果第二个参数为true,如前例所示,就会生成关联数组。
如果没有这个参数,同样的JSON将解码为stdclass类的一个对象,包含两个属性:sugar和butter。
通过URL在页面之间传递串行化数据时,应当在数据上调用urlencode(),来确保对其中的URL元字符转义