Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top