PHP中foreach循环中的参考对象

5

假设我有以下这些类:

class Foo {
   public $_data;
   public function addObject($obj) {
        $this->_data['objects'][] = $obj;
   }
}

class Bar {
    public $_data;
    public function __construct() {
        $this->_data['value'] = 42;
    }
    public function setValue($value) {
        $this->_data['value'] = $value;
    }
}

$foo = new Foo();
$bar = new Bar();
$foo->addObject($bar);
foreach($foo->_data['objects'] as $object) {
    $object->setValue(1);
}
echo $foo->_data['objects'][0]->_data['value']; //42

我的实际代码非常相似,使用了ArrayAccess:

foreach($this->_data['columns'] as &$column) {
                $filters = &$column->getFilters();
                foreach($filters as &$filter) {
                    $filter->filterCollection($this->_data['collection']);
                }
            }

filterCollection可以在$filter中更改值,但当您查看$this对象时,该值不正确。


你正在改变变量 $object 的值,但这不是你后面要输出的变量 ($foo->_data['objects'][0])。 - egis
你应该得到一个1。如果你在PHP 4中运行这个代码,它会因为public关键字而导致解析错误;如果你在PHP 5中运行,它会按照你的期望工作。我测试了你的代码,得到了1。 - BoltClock
我知道对象是通过引用传递的,但是可能foreach循环在某种程度上有所不同。现在无法测试它。无论如何,感谢您澄清这一点 ;) - egis
1
@egis:这是默认行为;对象只有在clone $object时才会被复制,即使这样也只进行浅拷贝。 - BoltClock
3个回答

10
foreach($foo->_data['objects'] as &$object) {
    $object->setValue(1);
}
注意 & 符号。

我尝试了 & 运算符,但它没有起作用。问题在于我的示例太简化了,我已经在我的问题中放置了实际代码。 - chris
8
这里实际上不需要使用 &$object 已经代表了对相同对象的引用。 - BoltClock
这对于我所提出的问题是正确的,然而,我的问题最终在于错误的会话初始化。 - chris

1

Foreach 操作的是数组的副本。在对象变量前加上 &。

foreach($foo->_data['objects'] as &$object)

4
是的,它操作的是数组的副本,但是这个副本持有指向相同对象的引用。 - BoltClock

0

PHP编程范式是对象(和资源)始终作为引用传递,而其他类型(基本类型或数组)则被复制,因此&运算符对于对象没有影响(并且对于资源来说是无意义的,因为只有“特殊函数”即外部库模块可以将它们作为参数),但允许通过引用传递其他类型的变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接