PHP在数组中存储对象引用

时间:2014-03-16 02:35:03

标签: php arrays object pass-by-reference

我在使用PHP中的引用时遇到了一些问题。假设您执行以下操作:

<?php

class foo
{
    public $str;
}

class bar
{
    public $txt;
}

class x
{
    private $objs = array();

    public function add(&$obj)
    {
        $this->objs[] = $obj;
    }

    public function update()
    {
        foreach($this->objs as $obj)
        {
            $obj = new bar();
            $obj->txt = "bar";
        }
     }
}

//Make x
$x = new x();

//Make foo
$foo = new foo();
$foo->str = "foo";

//Add
$x->add($foo);

//update
$x->update();

var_dump($foo);

最后的var_dump给出:

class foo#2 (1) {
  public $str =>
  string(3) "foo"
}

显然,我没有在数组中正确存储我的引用。有没有办法做到这一点,$foo之后bar类型为$x->update()

1 个答案:

答案 0 :(得分:2)

试试这个。我不知道为什么或如何运作。只是在所有地方添加了一些'&amp;'。

public function add(&$obj)
{
    $this->objs[] = &$obj;
}

public function update()
{
    foreach($this->objs as &$obj)
    {
        $obj = new bar();
        $obj->txt = "bar";
    }
}

更新

一个对象实际上只是逻辑上(对我们来说)一个引用,但在技术上与php中的引用不同。

PHP manual解释了这一点。对象变量与引用不同。 Reference是变量的别名。它指向该变量保存的相同数据。 Object是保存对象标识符的数据类型。所以你也可以引用对象。

$a = new foo();
$b = $a;

$ a和$ b这里有2个不同的变量,它们都具有相同的值(对象ID),而不是别名或引用类型。 这就像$a = 1;$b = $a;一样。

数组可以存储引用。 通过执行var_dump($x->objs);,您可以在数组中看到对象引用。

您通常不会在var_dump输出中看到对象的引用,因为引用会不断被赋值取消引用。你也不能对var_dump和array_push等函数进行调用时调用。

您的问题是由解除引用引起的,并且缺少其他引用运算符。