我在使用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()
?
答案 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等函数进行调用时调用。
您的问题是由解除引用引起的,并且缺少其他引用运算符。