Foreach循环中的PHP引用对象
假设我有这些课程:Foreach循环中的PHP引用对象,php,pass-by-reference,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; } publ
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对象时,该值不正确
foreach($foo->_data['objects'] as &$object) {
$object->setValue(1);
}
请注意&Foreach操作数组的副本。在对象变量之前使用&
foreach($foo->\u数据['objects']作为&$object)
PHP范例是,对象(和资源)始终是引用,而其他类型(基本类型或数组)是复制的,因此&运算符对对象没有影响(并且对资源没有意义,因为只有“特殊函数”(即外部库模块)可以将它们作为参数),但允许通过引用传递其他类型的变量。您正在更改此变量的值:$object
。它不是您稍后输出的数据($foo->\u data['objects'][0]
),您应该得到1。若您在PHP4中运行它,它将导致带有public
关键字的解析错误,若您在PHP5中运行它,它将像您期望的那个样工作。我测试了你的代码,得到了1。我知道对象是通过引用传递的,但我认为foreach循环在某种程度上是不同的。现在无法测试它。无论如何,谢谢你澄清这一点;)@这是默认的行为;对象仅在克隆$object上复制,即使这样,它也只能进行浅层复制。我尝试了&但它不起作用。问题是我的例子被简化了。我在问题中加入了我的实际代码。实际上,&
在这里是不必要的$object
已经表示对相同对象的引用。这对于我提出的问题是正确的,但是,我的问题最终是会话初始化不正确。是的,它在数组的副本上运行;但是,此副本包含对相同对象的引用。