编辑:
我必须确认这一点,但这种行为已被归类为 PHP 中的错误。有关更多详细信息,请参阅错误报告。
现有行为会导致您的字符串在PHP 内部被转换为 int/float(数字类型)。如果您提供 JSON 编码的对象、数组或字符串,该函数会执行它所描述的操作,但现在这反映了错误的行为。
$json = '12345678901234567890';
var_dump(json_decode($json)); /* float(1.2345678901235E+19) */
var_dump(json_decode($json, false, 512,
JSON_BIGINT_AS_STRING)); /* float(1.2345678901235E+19) */
如您所见,两者都给了我们一个浮点数,但是当我们使用有效的 JSON 对象、数组或有效的 JSON 作为字符串时,我们会得到预期的结果。
$jsonStr = '"12345678901234567890"'; // as a string
$jsonArr = '[12345678901234567890]'; // as an array
$jsonObj = '{"num":12345678901234567890}'; // as an object
var_dump(
json_decode($jsonStr), /* It's JSON_BIGINT_AS_STRING by default in 5.4 */
json_decode($jsonArr),
json_decode($jsonArr, false, 512, JSON_BIGINT_AS_STRING),
json_decode($jsonObj),
json_decode($jsonObj, false, 512, JSON_BIGINT_AS_STRING)
);
输出如下所示...
string(20) "12345678901234567890"
array(1) {
[0]=>
float(1.2345678901235E+19)
}
array(1) {
[0]=>
string(20) "12345678901234567890"
}
object(stdClass)#1 (1) {
["num"]=>
float(1.2345678901235E+19)
}
object(stdClass)#2 (1) {
["num"]=>
string(20) "12345678901234567890"
}
这应该很快就会解决,但现在我只想更新我的答案以反映这些新信息。