📅  最后修改于: 2023-12-03 15:32:22.716000             🧑  作者: Mango
在 Web 应用程序中,我们经常需要在浏览器端使用 JavaScript 并将其序列化发送到服务器端。服务器需要使用 PHP 来将该序列化的数据反序列化为对象进行处理。本文将介绍如何在 PHP 中反序列化 JS 对象。
在 JavaScript 中,我们可以使用 JSON.stringify()
方法将对象序列化为字符串。序列化后的字符串可以用于网络传输和存储。
var obj = { name: "John", age: 30, city: "New York" };
var str = JSON.stringify(obj);
反过来,我们可以使用 JSON.parse()
方法将字符串反序列化为 JavaScript 对象。
var obj = JSON.parse(str);
虽然 JS 的序列化非常方便,但它的格式并不适合 PHP 反序列化。当我们在 PHP 中尝试将 JS 序列化的字符串反序列化为对象时,将会出现错误。
$data = '{"name":"John","age":30,"city":"New York"}';
$obj = unserialize($data); // Error!
为了解决这个问题,我们需要使用一种 PHP 序列化格式,它可以在 PHP 和 JS 中相互转换。
PHP 序列化格式是一种二进制格式,以 NUL(-1) 结尾,采用字符串、整数和数组混合表示。我们可以使用 PHP 的 serialize()
方法将对象序列化为 PHP 格式的字符串。
$obj = array('name' => 'John', 'age' => 30, 'city' => 'New York');
$data = serialize($obj); // "a:3:{s:4:"name";s:4:"John";s:3:"age";i:30;s:4:"city";s:8:"New York";}"
我们可以将 PHP 格式的字符串发送到服务器端,然后在 PHP 中使用 unserialize()
方法将其反序列化为对象。
$obj = unserialize($data);
我们可以通过在 JS 中编写一个函数来将 JS 对象序列化为 PHP 格式的字符串。
function serialize(obj) {
var str = '';
if (typeof obj === 'object') {
for (var key in obj) {
if (str != '') {
str += '&';
}
str += encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]);
}
}
return str;
}
该函数将 JS 对象序列化为一个 URL 编码的字符串,就像表单提交一样。我们可以使用 decodeURIComponent()
方法将其反转义,然后使用 PHP 的 parse_str()
方法将其解析成一个数组。
var obj = { name: "John", age: 30, city: "New York" };
var str = serialize(obj); // "name=John&age=30&city=New%20York"
var data = decodeURIComponent(str);
parse_str(data, $arr);
然后,我们可以使用 PHP 的 serialize()
方法将该数组序列化为 PHP 格式的字符串。
$data = serialize($arr);
虽然将 JS 格式的数据序列化为 PHP 格式的字符串可以成功反序列化,但对于一些特殊情况,它仍然存在问题。
对象和循环引用无法正确处理。如果 JS 中的对象存在循环引用,它将无法被序列化为 PHP 格式。
类别信息丢失。当在 PHP 中反序列化该字符串时,对象将没有类别信息。这将导致使用对象时出现错误。
序列化结果会很长。将 JS 序列化为 PHP 格式的字符串会占用大量内存。如果我们需要传输大量数据,效率将受到影响。
在 Web 开发中,我们经常需要在前端使用 JavaScript,而在后端使用 PHP 来处理请求。了解如何将 JS 格式的数据序列化为 PHP 格式的字符串,并使用 unserialize()
方法将其反序列化为 PHP 对象非常重要。但序列化格式的选择需要谨慎,确保它在各个平台上都能正常工作,并且不会影响性能。