миграция — переход с PHP 7.1.x на PHP 7.2.x json_decode () change

Официальный документ говорит:

Параметр функции 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

Решение

Проверить подпись функции:

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,

Вот сокращенное демо показывая разницу:

$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.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]