1

是否可以使 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;

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

对不起,如果这是一个愚蠢的问题,但由于某种原因它难倒我!

感谢任何帮助:)

4

6 回答 6

5

简而言之,不,因为您将始终必须命名您的属性。用 ArrayAccess 编写一个简单的类的麻烦是没有意义的,因为您基本上重新创建了一个数组,除了在性能和透明度方面做出极大的牺牲外,没有任何东西可以显示。

是否有某种原因无法通过使用数组更简单地无限解决您的问题,或者这只是一个希望我知道的问题?

编辑:查看这个问题以获取更多信息。

于 2010-01-07T18:21:51.550 回答
4

不,你不能。像这样使用方括号 ( []) 在 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);
于 2010-01-07T18:29:00.193 回答
1

我真的看不出你的意思,除了

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

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

于 2010-01-07T18:24:11.607 回答
1

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

如果您想要命名元素,请使用对象或关联数组。

至于为什么你会得到不同的行为,那是因为在数组中,你没有指定索引,所以 PHP 使用数组的长度作为索引。对于对象,您必须指定名称(在本例中为“a”)。

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

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

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

$obj = (object) array(
    'arr' => array(
        'foo',
        'bar'
    )
);
于 2010-01-07T18:24:57.800 回答
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;
        }
    }
}
于 2010-01-07T18:22:39.020 回答
-1

你可以在 JavaScript 中得到这个。

于 2013-07-31T06:30:57.093 回答