Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Foreach循环中的PHP引用对象_Php_Pass By Reference - Fatal编程技术网

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
已经表示对相同对象的引用。这对于我提出的问题是正确的,但是,我的问题最终是会话初始化不正确。是的,它在数组的副本上运行;但是,此副本包含对相同对象的引用。