从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 

一样,如果它失去了参考。

那么,怎么了?我已经获得了元素变量的引用,而不是元素本身?

任何想法?

编辑:为了澄清,我想“改变”与另一个对象元素,但保持阵列中的位置。

现在我明白这是不可能以这种方式:(

+0

为什么你试图访问一个空引用?你期望什么样的结果? – Simon 2010-05-12 13:07:16

您在指向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作为新的值被分配到$elementA

您检索了一个参考并将其分配给变量$element。然后,您将该变量切换为引用新对象而不是操纵旧对象。

当你这样做:

$element = null; 
$element->another_var = "bla"; 

你another_var的值设置为空对象,因为$元素现在是空。 如果你试试这个

$element->another_var = "bla";  
$element = null; 

那么它应该工作