如何json_encode $ GLOBALS?

时间:2014-04-19 21:28:07

标签: php json globals

我正在尝试调试PHP应用程序,作为调试过程的一部分,我通过AJAX请求将print_r($ GLOBALS)传递给我的浏览器。但是,我更喜欢以原生JSON格式看到它,因为它在浏览器中表现得更好。我正在尝试使用以下代码片段:

json_encode($GLOBALS);

但我发现它返回bool(false)。 JSON documentation表示“成功时返回JSON编码字符串,失败时返回FALSE。”但是$ GLOBALS会失败吗?它是递归的$ GLOBALS ['GLOBALS']吗?

我在考虑作为循环$ GLOBALS的替代方法并将其放在数组中,但当json_encode用于编码数组时,这似乎毫无意义。

3 个答案:

答案 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);