編集:
これを確認する必要がありましたが、この動作は 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) */
ご覧のとおり、どちらも float を返しますが、有効な 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"
}
これはすぐに修正されるはずですが、今のところ、この新しい情報を反映するように回答を更新したかっただけです。