如何覆盖PHP中json_encode()函数的功能

5

我用PHP编程语言创建了很多API,输出结果时使用了以下标签:

json_encode($arr),

现在我想以漂亮的打印格式在浏览器中打印输出,而不使用JSON Viewer扩展。
我已经完成了400多个Web服务,使用json_encode($ arr)进行输出,但我不想改变。
 echo json_encode($arr, JSON_PRETTY_PRINT);

我只想知道如何覆盖默认的json_encode()预定义功能以满足我的需求。


1
echo "<pre/>"; echo json_encode($arr); - Alive to die - Anant
回显 "<pre/>"; 回显 json_encode($arr,true); - GYaN
如果我按照您的要求做,我需要修改所有400多个API,但我不想改动它们,我只想在一个地方覆盖功能。 - Manikanta
然后创建一个函数,但你也必须在那400多个地方调用该函数。 - Alive to die - Anant
你有检查过 override_function 函数吗? - K.B
显示剩余3条评论
3个回答

3

有一些方法可以通过使用一些扩展来实现,如runkit提供runkit_function_redefine() 或者 apd提供override_function()

如果我是你,我会简单地查找/替换json_encode()调用,添加JSON_PRETTY_PRINT


是的,使用override_function我们可以实现所需的功能。 - K.B

2

另外一种方案是不需要重新定义json_encode函数,你可以注册一个输出处理器,在打印JSON后再次打印出格式优美的JSON。

ob_start(function($json) {
    return json_encode(json_decode($json), JSON_PRETTY_PRINT);
});

这种解决方案的好处是,您不需要任何php扩展(因为runkit目前在PHP 7中不起作用)。

但是有点贵:您需要对相同的内容进行编码、解码和重新编码。 - Roberto Bisello

2

您可以像这样使用override_function

rename_function('json_encode', 'original_json_encode');
override_function('json_encode', '$value, $options = 128, $depth = 512', 'return original_json_encode($value, $options, $depth);');

通过这种方式,您可以使用原始方法来获取结果,覆盖默认选项(128是JSON_PRETTY_PRINT的值),并且您可以像以前一样使用json_encode


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接