могу ли я использовать stdClass как массив?

Можно ли заставить объекты 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;

я знаю, что могу менять «а» каждый раз,

извините, если это глупый вопрос, но он меня почему-то ставит в тупик!

Ценю любую помощь :)

Дэн


person significance    schedule 07.01.2010    source источник
comment
Вы просто хотите вставить поле в объект? Это не имеет смысла. Используйте массив.   -  person meagar    schedule 07.01.2010
comment
Похоже, что оригинальный постер хочет объект, которому вы можете назначать свойства, но также имеет встроенный массив.   -  person Alan Storm    schedule 07.01.2010


Ответы (6)


Короче говоря, нет, потому что вам всегда придется называть свои свойства. Трудности с написанием простого класса с ArrayAccess также не имеют смысла, поскольку вы, по сути, воссоздали массив, которому нечего показать, кроме крайних жертв в производительности и прозрачности.

Есть ли какая-то причина, по которой ваша проблема не может быть решена бесконечно проще с помощью массива, или это просто вопрос типа «хотел бы я знать»?

EDIT: проверьте этот вопрос для получения дополнительной информации.

person Dereleased    schedule 07.01.2010
comment
я думаю, что это может быть. это своего рода вопрос, который я хотел бы знать: я знаю, что мог бы использовать массив, но для меня использование только объектов stdClass более аккуратно, чем использование массивов и объектов stdClass для экземпляра, где я хочу использовать объекты в массивах. - person significance; 07.01.2010

Нет, ты не можешь. Подобное использование квадратных скобок ([]) называется "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);
person Alan Storm    schedule 07.01.2010
comment
Это происходит: stackoverflow.com/questions/1869812/ - person Dereleased; 07.01.2010
comment
Я знаю, посмотрите, кто задал этот вопрос. - person Alan Storm; 07.01.2010
comment
посмотри кто ответил. - person Jacob Raccuia; 18.09.2013

Я действительно не понимаю, что вы хотите сделать, если не считать

<?php
$obj->a = array();
$obj->a[] = 120;
$obj->a[] = 382;
// ...
?>

Вы не можете просто «вставить» поле в объект. В любом случае вам нужно знать имя поля, чтобы получить значение, так что это в значительной степени ерунда.

person meagar    schedule 07.01.2010

Объект не является массивом. Если вам нужны элементы с числовым индексом, используйте массив.

Если вам нужны именованные элементы, используйте объект или ассоциативный массив.

Что касается того, почему вы получаете другое поведение, это потому, что в массиве вы не указываете индекс, поэтому PHP использует длину массива в качестве индекса. Для объекта необходимо указать имя (в данном случае «а»).

Еще одна вещь, которую вы можете захотеть сделать, это иметь объект с членом, который является массивом:

$obj = new stdClass;
$obj->arr = array();
$obj->arr[] = 'foo';
$obj->arr[] = 'bar';

также не забывайте, что вы можете привести массив к объекту:

$obj = (object) array(
    'arr' => array(
        'foo',
        'bar'
    )
);
person Stephen    schedule 07.01.2010

Только ради ООП не используйте классы. Если вы действительно хотите реализовать эту функциональность, используйте этот класс:

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;
        }
    }
}
person erenon    schedule 07.01.2010
comment
Я бы предложил использовать array_key_exists вместо isset, так как isset вернет false, если значение равно null. - person Dereleased; 07.01.2010

Вы можете получить именно это в JavaScript.

person Boyang    schedule 31.07.2013