6

在以下代码中:

$storage = new \SplObjectStorage();

$fooA = new \StdClass();
$fooB = new \StdClass();

$storage[$fooA] = 1;
$storage[$fooB] = array();

$storage[$fooA] = 2;
$storage[$fooB][] = 'test';

我希望$storage[$fooA]1,它是。我也希望$storage[$fooB]array('test'),但事实并非如此。这也触发了一条通知,上面写着“间接修改 SplObjectStorage 的重载元素对...没有影响”

我认为发生这种情况是因为ArrayAccessin的实现SplObjectStorage不会通过引用返回值。

有什么方法可以SplObjectStorage用作键是对象而值是可变数组的数据映射?做这种工作还有其他可行的选择吗?

4

1 回答 1

6

间接修改(即offsetGet返回引用)是最近的一项能力。见注释ArrayAccess::offsetGet。SplObjectStorage 似乎没有使用它(还没有?)。

我建议您改用直接修改:

$a = $storage[$fooB];
$a[] = 'test';
$storage[$fooB] = $a;
于 2012-02-21T16:02:49.957 回答