我正在尝试创建一个公共常量文件,以便在php和javascript之间共享,使用JSON来存储常量。但我想知道为什么要使用json_encode()
将JSON从PHP传递到javascript,而不是回显JSON声明。
假设我有PHP JSON
<?php
$json_obj = '{"const1": "val",
"const2": "val2"
}';
?>
在谷歌上搜索,似乎返回javascript的典型方式是使用
<?php echo json_encode($json_obj); ?>
然后我相信我必须使用类似$.getScript()
的东西来读取php文件以获得$json_obj
,然后使用parseJSON()
使其在javascript中可用。
但为什么不改为
<?php echo 'var json = '.$json_obj; ?>
通过这种方式,您所要做的就是直接加载脚本,并准备好直接使用json。
为什么使用json_encode()
比简单地将声明回显到javascript更有利?
在您的例子中,$json_obj
已经是一个字符串。所以没有必要。但是,如果您有一个要传递给javascript的数组,json_encode
将对此有所帮助。
这一切都取决于您想从服务器向客户端发送什么——无论是数据(JSON)还是一些代码。
两种方法:
-
在服务器上回显一个JSON文件,然后打印JSON文档并将响应
Content-Type
设置为application/json
。通过这种方式,您可以使用任何您想要的AJAX库,如$.get
或原始XMLHttpRequest
等。这是一种传递数据的方式。 -
在服务器上回显Javascript代码,然后使用
$.getScript
加载它。这是一种传递代码的方式。这可能不太安全,因为您的代码不仅可以包含JSON,还可以包含任何任意代码。所以,如果攻击者能够破坏您的服务器,他就可以将代码推送到任何客户端进行远程执行。
如果您只想传递数据,请使用第一种方法。它更干净、更安全。
此外,如果您最终在不同的环境中编写前端,比如说不同的编程语言,那么您将能够恢复相同的JSON返回端点。如果您返回Javascript代码,这将更加困难。
将PHP JSON传递给Javascript并读取
var data = <?php echo json_encode($json); ?>;
var arr = new Array();
arr = JSON.parse(data);
document.write( arr[0].something );
尽管这对您的特定问题来说可能有些过头了,但我仍然会选择json_encode/parse选项。为什么?你问。好吧,把它看作是避免重复。如果你编码/解析,你可以把常量保存在一个对象中,让PHP代码很容易阅读。JS代码也是如此。
它只是消除了对它的干扰。
constant.php
<?php
$array = array("const1" => "val", "const2" => "val2");
?>
<script>
var contants = <?php echo json_encode($array); ?>
</script>
=====================文件结束常量.php======
在php中,您可以使用访问
$array["<key>"]
在javascript中,您可以使用访问
contants.const1, ....
通常这就是我所做的,也是我发现的最安全的方法:
// holds variables from PHP
var stuff = {};
try {
// stuff will always be an object
stuff = JSON.parse('<?php echo empty($stuff) ? '{}' : json_encode($stuff) ?>');
} catch (e) {
if (e instanceof SyntaxError)
{
// report syntax error
console.error("Cannot parse JSON", e);
}
}
// show resulting object in console
console.log("stuff:", stuff);
如果使用php数组而不是字符串,则使用json_encode
:
$array = array("const1" => "val", "const2" => "val2");
echo json_encode($array);
如果你在一个字符串上调用json_encode,你会得到:
"{'"const1'": '"val'", '"const2'": '"val2'"}"
json_encode()
的参数应该是PHP数据结构,而不是已经是JSON格式的字符串。当您想将PHP对象传递给Javascript时,可以使用此选项。
json_encode
是一个将PHP数组转换为JSON字符串的函数,仅此而已。由于$json_obj
变量已经为JSON字符串,因此不需要进一步的转换,您只需将其回显即可。
要从数组中获取$json_obj
字符串,您的代码看起来像这个
$json_array = array(
"const1" => "val",
"const2" => "val2"
);
$json_obj = json_encode($json_array);
PHP到JSON
var locations = <?php echo json_encode($sample_location_master); ?>;