我可以像数组一样使用stdClass吗?

时间:2010-01-07 18:14:31

标签: php arrays 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;

我知道我每次都可以改变'a',

抱歉,如果这是一个愚蠢的问题,但由于某种原因它让我感到难过!

感谢任何帮助:)

6 个答案:

答案 0 :(得分:5)

简而言之,不,因为您将始终必须为您的财产命名。通过使用ArrayAccess编写一个简单类的麻烦也没有任何意义,因为除了在性能和透明度方面的极端牺牲之外,你实际上已经创建了一个没有任何东西要展示的数组。

是否有某种原因你的问题不能通过使用数组无限地解决,或者这只是一个我想知道的愿望?

编辑:查看this question了解更多信息。

答案 1 :(得分:3)

不,你不能。使用这样的括号([])在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);

答案 2 :(得分:1)

我无法真正理解你的意思,缺少

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

您不能简单地将字段“推”到对象上。您需要知道该字段的名称才能检索该值,所以这几乎是无稽之谈。

答案 3 :(得分:1)

对象不是数组。如果您想要数字索引元素,请使用数组。

如果您想要命名元素,请使用Object或Associative Array。

至于为什么你会得到不同的行为,这是因为在Array中你没有指定索引,因此PHP使用Array的长度作为索引。使用Object,您必须指定名称(在本例中为“a”)。

您可能想要做的另一件事是拥有一个Object,其成员是一个数组:

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

也不要忘记你可以将一个数组转换为一个对象:

$obj = (object) array(
    'arr' => array(
        'foo',
        'bar'
    )
);

答案 4 :(得分:0)

仅为了OOP,不要使用类。如果您确实想要实现此功能,请使用此类:

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;
        }
    }
}

答案 5 :(得分:0)

你可以在JavaScript中得到这个。