Больше информации в этом старом вопросе . Короткая версия состоит в том, что свойства для объектов / классов PHP следуют тем же соглашениям об именах, что и переменные . Числовое свойство недопустимо для объекта PHP, поэтому нет четкого правила относительно того, что должно происходить при сериализации объекта из другого языка (json / javascript), который имеет числовой ключ. В то время как вам кажется очевидным, что должно произойти с вышеизложенным, кто-то с другим уклоном считает поведение PHP в этом случае вполне допустимым и предпочтительным.
Итак, это своего рода ошибка, но больше неопределенной области спецификации без четкого ответа, поэтому не ожидайте, что поведение изменится в соответствии с вашими предпочтениями, и если оно действительно изменится, не ожидайте, что это изменение быть постоянным
Чтобы решить некоторые проблемы в комментариях, рассмотрите это
header('Content-Type: text/plain');
$json = '{"0" : "a"}';
$obj = json_decode($json);
$a = (array) $obj;
var_dump($a);
var_dump(array(0=>'a'));
var_dump(array('0'=>'a'));
, который выдаст что-то вроде этого
array(1) {
["0"]=>
string(1) "a"
}
array(1) {
[0]=>
string(1) "a"
}
array(1) {
[0]=>
string(1) "a"
}
Массив с нулевым одиночным строковым ключом не является допустимой конструкцией PHP. Если вы попытаетесь создать один PHP, вы превратите ноль в int для вас. Когда вы просите PHP выполнить приведение, для которого нет определения, он заканчивает тем, что создает массив со строковым ключом (из-за плохо определенных правил относительно того, что должно происходить здесь).
Хотя очевидно, что это «неправильное» поведение со стороны PHP, определить правильное поведение в языке, который слабо типизирован, непросто.