是否可以使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',
抱歉,如果这是一个愚蠢的问题,但由于某种原因它让我感到难过!
感谢任何帮助:)
丹
答案 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中得到这个。