Будьте осторожны при использовании ассоциативных массивов в PHP

17 Июл
2012

На прошлой неделе мы перевели проект на новый сервер с 64-битной ОС (это важно) и столкнулись с непонятным поведением PHP. На 32-битной ОС с такой же версией PHP все работало.
Как думаете, что выведет этот код? (поведение одинаково для 32 и 64 бит)
$object = new stdClass();
$key = "12345";
$object->{$key} = "Hello";
$array = (array)$object;

echo $array[$key]. ' '. (int)array_key_exists($key, $array) . "\n";
var_dump($array);


Вовсе не то, что ожидалось увидеть, а вот это:
PHP Notice:  Undefined offset: 12345 in /home/mib/tmp/2.php on line 9
 0
array(1) {
  ["12345"]=>
  string(5) "Hello"
}

Странно, да? Вот здесь говорится, что массив станет array(1) { [12345]=> string(5) «value»} с ключом типа int. Но и это не так. Запускаем
echo $array[12345]. ' '. (int)array_key_exists(12345, $array) . "\n";

и снова видим
PHP Notice:  Undefined offset: 12345 in /home/mib/tmp/2.php on line 9
0

Со строками такого не будет, все работает как и ожидалось. Так почему же на 32-битной ОС мы не замечали этого бага? — А вот почему. В проекте у нас ключи значительно длиннее, и в 32-битной ОС они представлялись строками, а со строками все работает отлично. А вот на 64-битной системе они уже стали помещаться в int
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх