могу ли я использовать stdClass как массив?
Вопрос
возможно ли заставить объекты stdClass работать как общий индексированный массив?
т. е.$array = Массив ( [0] => 120 [1] => 382 [2] => 552 [3] => 595 [4] => 616 )
был бы сконструирован следующим образом
$a = array();
$array[] = 120;
$array[] = 382;
и т.д.
но если я делаю это с объектом, он просто перезаписывает сам себя:
$obj = new stdClass;
$obj->a = 120;
$obj->a = 382;
я знаю, что могу менять букву "а" каждый раз,
извините, если это глупый вопрос, но по какой-то причине он ставит меня в тупик!
Буду признателен за любую помощь :)
Dan
Решение
Короче говоря, нет, потому что вам всегда придется давать имена своим свойствам.Переживать из-за написания простого класса с ArrayAccess также не имеет смысла, поскольку вы, по сути, воссоздали массив, которому нечего показать, за исключением крайних жертв в производительности и прозрачности.
Есть ли какая-то причина, по которой ваша проблема не может быть решена бесконечно проще с помощью массива, или это просто вопрос, который я хотел бы знать?
Редактировать:Проверьте этот вопрос для получения дополнительной информации.
Другие советы
Нет, ты не можешь.Использование скобок ([]
) подобное тому, что называется "ArrayAccess" в PHP и не реализовано на stdClass
объект.
Это похоже на тебя мог бы хотите что-то вроде
$foo = new stdClass();
$foo->items = array();
$foo->items[] = 'abc';
$foo->items[] = '123';
$foo->items[] = 'you and me';
Вы также могли бы попробовать привести массив в качестве stdClass, чтобы посмотреть, что произойдет.
$foo = array();
$foo[] = 'abc';
$foo[] = '123';
$foo[] = 'you and me';
$foo = (object) $foo;
var_dump($foo);
Я действительно не могу понять, что ты собираешься делать, за исключением
<?php
$obj->a = array();
$obj->a[] = 120;
$obj->a[] = 382;
// ...
?>
Вы не можете просто "подтолкнуть" поле к объекту.Вам все равно нужно знать название поля, чтобы получить значение, так что это в значительной степени бессмыслица.
Объект - это не массив.Если вам нужны элементы с числовой индексацией, используйте массив.
Если вам нужны именованные элементы, используйте либо Объект, либо Ассоциативный массив.
Что касается того, почему вы получаете другое поведение, это потому, что в массиве вы не указываете индекс, поэтому PHP использует длину массива в качестве индекса.Для объекта вы должны указать имя (в данном случае 'a').
Другая вещь, которую вы, возможно, захотите сделать, - это создать объект, членом которого является массив:
$obj = new stdClass;
$obj->arr = array();
$obj->arr[] = 'foo';
$obj->arr[] = 'bar';
также не забывайте, что вы можете преобразовать массив в объект:
$obj = (object) array(
'arr' => array(
'foo',
'bar'
)
);
Только ради ООП не используйте классы.Если вы действительно хотите реализовать эту функциональность, используйте этот класс:
class ArrayClass
{
protected $storage = array();
public function push($content) {
$this->storage[] = $content;
return $this;
}
public function get($index) {
if (isset($this->storage[$index])) {
return $this->storage[$index];
} else {
//throw an error or
return false;
}
}
}
Вы можете получить именно это в JavaScript.