json_decode和PHP:JSON_BIGINT_AS_STRING差距

json_decode and PHP: JSON_BIGINT_AS_STRING disparity

使用 Homestead, I try to run the BIGINT example #5 from the PHP docs 得到 "Integer overflow notice"。标记 JSON_BIGINT_AS_STRING 被忽略,结果无效(最大 bigint 为 9223372036854775807)。

Homestead 实例具有以下软件堆栈:

然后我在 3v4l 和 it works 上测试了它。我不知道他们的 JSON 设置。

然后我在 OS X 的 pre-installed PHP 上测试了它:

这也有效 - 就像在文档中一样。

随后,我发现 this issue which leads to this commit 并且似乎是导致这里问题的原因,但为什么 Remi 使 >64 位数字无效并调用整数溢出,尽管默认 JSON 扩展(存在于 3v4l 上)和 OS X 本机)不这样做?这不违反它是 "drop in replacement" 的说法吗?在当前状态下,许多安装中默认包含的这个扩展直接违反了 PHP 的官方文档。

是否有不需要对所用库进行内部更改的好的解决方案,例如 Guzzle?

编辑:进一步搜索后,我发现 this 这证实了 一位开发人员的意见 是这里出现问题的原因。

是的,这真的只是 Remis 的意见。这样一来,它显然不是 100% 的直接替代品。你问为什么允许?因为没有人可以禁止自由开发人员按照自己的方式编写自己的代码。

所以……你所能做的就是抱怨并自己编译ext/json(而不是使用JSON-C)。

这意味着从 php-src 源 (https://github.com/php/php-src) 克隆,检查 PHP-5.6 分支,导航到 ext/json 目录并通过 [=10= 编译].然后将该扩展名添加到您的 php.ini 而不是 json-c 扩展名。 [如果需要,您可能需要先安装一些编译工具...]

请注意,在 PHP 7.0 中,json 扩展被一个新的实现所取代(另请参阅 RFC:https://wiki.php.net/rfc/jsond),它没有这些问题,另外还有没有许可证问题。