从PHP中的数组返回对象时引用问题
问题描述:
我有一个引用问题;的例子应该是更具描述性比我:P从PHP中的数组返回对象时引用问题
我有一个类具有对象的数组,并通过一个键(字符串)检索它们,像关联数组:
class Collection {
public $elements;
function __construct() {
$this->elements = array();
}
public function get_element($key) {
foreach($this->elements as $element) {
if ($element->key == $key) {
return $element;
break;
}
}
return null;
}
public function add_element ($element) {
$this->elements[] = $element;
}
}
然后我有一个对象(通用),用钥匙和一些变量:
class Element {
public $key;
public $another_var;
public function __construct($key) {
$this->key = $key;
$this->another_var = "default";
}
}
现在,我创造我的收藏:
$collection = new Collection();
$collection->add_element(new Element("test1"));
$collection->add_element(new Element("test2"));
然后我试图改变包含在我的“数组”的元素的变量:
$element = $collection->get_element("test1");
$element->another_var = "random_string";
echo $collection->get_element("test1")->another_var;
好,产量
random_string
,所以我知道,我的对象传递给$元素参考模式。
但如果我这样做,而不是:
$element = $collection->get_element("test1");
$element = null; //or $element = new GenericObject();
$element->another_var = "bla";
echo $collection->get_element("test1")->another_var;
输出
default
一样,如果它失去了参考。
那么,怎么了?我已经获得了元素变量的引用,而不是元素本身?
任何想法?
编辑:为了澄清,我想“改变”与另一个对象元素,但保持阵列中的位置。
现在我明白这是不可能以这种方式:(
答
您在指向null的元素上更改another_var变量。 这意味着你不改变集合元素都没有。这就是为什么你得到的值“默认” ......
即使你用引用工作时,引用本身是按值传递。这应该更清楚:
$a = new Object();
$b = $a;
$a = null;
$b
仍然是在这种情况下new Object()
。
编辑:
如果你想在这个位置来改变对象,你要访问您的收藏(可能的关联数组),并在该位置改变的对象。你可以通过提供一个set_element($ key,$ value)来做到这一点。
<?
class Collection
{
private $elements;
public set_element($key, $value)
{
$elements[$key] = $value;
}
public get_element($key)
{
return $elements[$key];
}
}
?>
答
$element
有参考对象,这是正确的,但如果你
$element = null; //or $element = new GenericObject();
您分配一个新的值$element
而你失去了参照以前的对象
如果我这样做:。
$element = new A();
然后
$element = new B();
$element->foo();
我访问B
类的对象的方法和foo
作为新的值被分配到$element
不A
。
答
您检索了一个参考并将其分配给变量$element
。然后,您将该变量切换为引用新对象而不是操纵旧对象。
答
当你这样做:
$element = null;
$element->another_var = "bla";
你another_var的值设置为空对象,因为$元素现在是空。 如果你试试这个
$element->another_var = "bla";
$element = null;
那么它应该工作
为什么你试图访问一个空引用?你期望什么样的结果? – Simon 2010-05-12 13:07:16