Foreach循环中的PHP参考对象

时间:2011-02-02 06:23:02

标签: php pass-by-reference

让我说我有这些课程:

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对象时,该值不正确。

3 个答案:

答案 0 :(得分:9)

foreach($foo->_data['objects'] as &$object) {
    $object->setValue(1);
}

注意&

答案 1 :(得分:1)

Foreach对阵列的副本进行操作。使用&在对象变量之前。

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

答案 2 :(得分:0)

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