从PHP 7.1.x迁移到PHP 7.2.x json_decode()更改

时间:2018-05-24 19:30:52

标签: php migration php-7.2 jsondecoder

The official doc说:

  

现在使用了json_decode()函数选项JSON_OBJECT_AS_ARRAY   如果第二个参数(assoc)为NULL。先前,   JSON_OBJECT_AS_ARRAY始终被忽略。

此代码(AFAIK)完成此更改和条件:

<?php

$an_object = new StdClass();
$an_object->some_atrribute = "value 1";
$an_object->other_atrribute = "value 2";

//an object
print_r($an_object);

$encoded = json_encode($an_object);

//here (null is passed in the second parameter)
$output = json_decode($encoded,null,512);

//using 7.2 should be array, however it is an object
print_r($output);

//array
$output = json_decode($encoded,true);
print_r($output);

但是只有最后一次打印,打印为数组。

我理解错了吗?

1 个答案:

答案 0 :(得分:5)

检查function signature

mixed json_decode ( string $json [, bool $assoc = FALSE 
  [, int $depth = 512 [, int $options = 0 ]]] )
  

选项

     

JSON解码选项的位掩码。目前有两个   支持的选项。第一个是允许的JSON_BIGINT_AS_STRING   将大整数转换为字符串而不是浮点数,这是默认值。   第二个选项是JSON_OBJECT_AS_ARRAY,其效果与相同   将assoc设置为TRUE

这意味着即使您没有将第二个参数设置为JSON_OBJECT_AS_ARRAY,也可以将第四个参数设置为true某些原因,但将其设置为null。但是这个第四个参数的默认值是0,这意味着如果只有第二个参数被设置为null,则不会进行转换(从对象到数组)。

这里显示了差异的the shortened demo

$an_object = new StdClass();
$an_object->attr = 'value';

$encoded = json_encode($an_object);
print_r( json_decode($encoded, true, 512, JSON_OBJECT_AS_ARRAY)  );
print_r( json_decode($encoded, false, 512, JSON_OBJECT_AS_ARRAY) );
print_r( json_decode($encoded, null, 512, JSON_OBJECT_AS_ARRAY)  );

在这里,您将看到在所有PHP版本中作为第一个和第二个解码操作的结果打印的数组和对象。但是第三个操作只会在PHP 7.2.0之后生成数组。