я могу использовать stdClass как массив? - PullRequest
1 голос
/ 07 января 2010

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

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

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

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

Dan

Ответы [ 6 ]

5 голосов
/ 07 января 2010

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

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

РЕДАКТИРОВАТЬ: Проверьте этот вопрос для получения дополнительной информации.

3 голосов
/ 07 января 2010

Нет, вы не можете. Использование таких скобок ([]) в PHP называется «ArrayAccess» и не реализовано для объекта 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);
1 голос
/ 07 января 2010

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

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

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

Другая вещь, которую вы можете захотеть сделать, это иметь Object с элементом, который является массивом:

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

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

$obj = (object) array(
    'arr' => array(
        'foo',
        'bar'
    )
);
1 голос
/ 07 января 2010

Я не могу понять, что ты собираешься делать, если не считать

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

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

0 голосов
/ 31 июля 2013

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

0 голосов
/ 07 января 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;
        }
    }
}
...