我正在尝试调试PHP应用程序,作为调试过程的一部分,我通过AJAX请求将print_r($ GLOBALS)传递给我的浏览器。但是,我更喜欢以原生JSON格式看到它,因为它在浏览器中表现得更好。我正在尝试使用以下代码片段:
json_encode($GLOBALS);
但我发现它返回bool(false)。 JSON documentation表示“成功时返回JSON编码字符串,失败时返回FALSE。”但是$ GLOBALS会失败吗?它是递归的$ GLOBALS ['GLOBALS']吗?
我在考虑作为循环$ GLOBALS的替代方法并将其放在数组中,但当json_encode用于编码数组时,这似乎毫无意义。
答案 0 :(得分:2)
自己测试后,看来json_encode()无法处理递归,例如$ GLOBALS ['GLOBALS']中提供的内容......等等。
你可以做的一个技巧(?)是:
json_encode(array_slice($GLOBALS, 1));
将跳过$ GLOBALS ['GLOBALS']并继续编码阵列的其余部分。
*编辑:$ GLOBALS ['GLOBALS']在打印此数组时首先出现,但更好的方法是找到$ GLOBALS ['GLOBALS']出现的位置并完全跳过该元素。
答案 1 :(得分:2)
我提出了一种方式,其中GLOBALS的位置并不重要:
json_encode(array_intersect_key($GLOBALS,array_flip(array("_GET", "_POST", "_FILES", "_COOKIE"))));
或更好的方式:
$new_array = $GLOBALS;
$index = array_search('GLOBALS',array_keys($new_array));
json_encode(array_splice($new_array, $index, $index-1));
答案 2 :(得分:0)
$GLOBALS
包含对自身的引用会导致json_encode
无法处理的无限递归,因为它超过了maximum depth of 512,因此默认情况下将返回false
解决方案是创建一个没有自我引用的$GLOBALS
副本,下面的函数仅引用superglobals _GET _POST _SERVER ..
,假设您在自己的目录中未使用$_
变量命名约定:
function getEncodableGlobals()
{
$g = [];
foreach ($GLOBALS as $key => &$val)
{
if ($key[0] == '_')
{
$g[$key] = &$val;
}
}
return $g;
}
请注意,$g
不保存副本,而仅引用变量,就像$GLOBALS
一样。如果您希望将所有变量都包括在全局范围内,只需更改条件即可排除麻烦的引用:
...
if ($key !== 'GLOBALS')
...
现在您可以安全地对其进行编码:
json_encode(
getEncodableGlobals()
);
您也可以通过array_filter
方式进行操作,然后复制变量。
$encodableGlobals = array_filter($GLOBALS, function($key) {
return $key !== 'GLOBALS';
}, ARRAY_FILTER_USE_KEY);