2010-05-12 66 views
0

我有一個引用問題;的例子應該是更具描述性比我: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

回答

1

您在指向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]; 
    } 
} 

?> 
1

$element有參考對象,這是正確的,但如果你

$element = null; //or $element = new GenericObject(); 

您分配一個新的值$element而你失去了參照以前的對象

如果我這樣做:。

$element = new A(); 

然後

$element = new B(); 
$element->foo(); 

我訪問B類的對象的方法和foo作爲新的值被分配到$elementA

1

您檢索了一個參考並將其分配給變量$element。然後,您將該變量切換爲引用新對象而不是操縱舊對象。

0

當你這樣做:

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

你another_var的值設置爲空對象,因爲$元素現在是空。 如果你試試這個

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

那麼它應該工作