мога ли да използвам stdClass като масив?

възможно ли е обектите stdClass да работят като генерично индексиран масив?

т.е. $масив = масив ( [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 също няма смисъл, тъй като по същество сте пресъздали масив без нищо за показване за него, освен изключителни жертви в производителността и прозрачността.

Има ли някаква причина проблемът ви да не може да бъде решен безкрайно по-просто с помощта на масив, или това е просто въпрос, който исках да знам?

РЕДАКТИРАНЕ: Вижте този въпрос за повече информация.

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 използва дължината на масива като индекс. С обекта трябва да посочите името (в този случай 'a').

Другото нещо, което може да искате да направите, е да имате обект с член, който е масив:

$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