Достать данные из объекта по числовому индексу

fedot

Новичок
Приветствую! Как вывести данные из объекта по числовому индексу?
PHP:
$obj = (object)[
    'foo' => 'bar',
    1 => '145',
    48 => 458,
    'property' => 'value',
];
var_dump($obj);
echo $obj->{1};
Получаю это:
Код:
object(stdClass)#1 (4) {
  ["foo"]=>
  string(3) "bar"
  [1]=>
  string(3) "145"
  [48]=>
  int(458)
  ["property"]=>
  string(5) "value"
}
PHP Notice:  Undefined property: stdClass::$1 in /home/cg/root/7386244/main.php on line 14
Как правильно вывести данные по индексу 1 и 48 ?
 

fixxxer

К.О.
Партнер клуба

fedot

Новичок
Мне вот что пришло в голову: а как достать данные по числовому индексу в версиях < 7.2 ? То есть в версии 7.1.8 разработчики нам позволяют создавать подобные объекты (пример в первом сообщении). А вот доставать оттуда данные уже нельзя (в некотором случае). Как такое возможно?
 

WMix

герр M:)ller
Партнер клуба
PHP:
$obj = (object)[...];
надо понимать, что изменение типа накладывает свои особенности
вот еще пример
PHP:
$a = "1234";
print_r($a[2]);
$a=(int)$a;
print_r($a[2]);
 

fedot

Новичок
Точно так, как написано в RFC.
Это понятно, я о другом. Неужели вы запилите функцию которой нельзя пользоваться и при этом она пройдет в официальную версию языка? Или вы хотите сказать что это баг который заметили только перед выходом версии 7.2 ?
 

Вурдалак

Продвинутый новичок
Переменные не должны начинаться с числа, такое, очевидно, никто не предусматривал. Это какой-то искусственный кейс, который требует такого же искусственного решения: наверняка, каст обратно в массив `(array)` выдаст то, что тебе нужно.
 

fixxxer

К.О.
Партнер клуба
Это понятно, я о другом. Неужели вы запилите функцию которой нельзя пользоваться и при этом она пройдет в официальную версию языка? Или вы хотите сказать что это баг который заметили только перед выходом версии 7.2 ?
Это всегда был задокументированный known issue, и ответом было "не делайте так".

В php массив - это специальная конструкция, с отдельно обрабатываемыми числовыми и строковыми индексами (и numeric string key кастится к инту), если задуматься над тем, как работает конструкция $foo[] = $value, будет ясно; в объектах же все ключи строковые. Если просто изменить тип с array на object, числовые индексы недоступны просто по внутреннему устройству. Если делать обход ключей, это приличный оверхед (который во времена php4, когда писался этот код, был куда более заметен). Плюс к тому тут еще история начиная со времен register_globals, когда _строковые_ ключи массивов одновременно были и глобальными переменными, вот к размышлению:
PHP:
$a = ["foo" => "value", 1 => 2]; extract($a); var_dump(get_defined_vars());
К 7.2, с одной стороны, железо стало чуточку быстрее, а с другой стороны, у кого-то дошли руки это поправить.
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
движок PHP переписали почти полностью, и он стал в разы быстрее, все последовательно:
в 7.0 выпустили AST, в 7.1 переписали массивы с частичным BC break, в 7.2 еще немного поломалиисправили
просто релизный цикл middle-версий языка - год
 
Сверху