возможно ли, чтобы объекты stdClass работали как общий индексированный массив?
т.е. $ array = 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;
я знаю, что могу менять «а» каждый раз,
извините, если это глупый вопрос, но по какой-то причине он меня пьет!
Цените любую помощь 🙂
Дэн
Короче говоря, нет, потому что вы всегда будете называть свои свойства. Попытка написать простой класс с ArrayAccess не имеет смысла, поскольку вы по существу воссоздали массив, в котором ничего не видно, кроме крайних жертв в производительности и прозрачности.
Есть ли какая-то причина, по которой ваша проблема не может быть решена бесконечно проще, используя массив, или это просто вопрос, который мне нужен?
EDIT: ознакомьтесь с этим вопросом для получения дополнительной информации.
Нет, ты не можешь. Использование скобок ( []
) подобно тому, как это называется «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 использует длину массива как индекс. С помощью Object вы должны указать имя (в данном случае «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.