2012-02-07 90 views
0

據我所知,通過使用「=」對象通過引用來分配對象,對於其他變量和數據類型(如字符串和整數),您需要使用「= &」通過引用進行分配。當您明確使用「= &」通過引用分配對象時,它似乎不會影響分配。但是,當您將對象分配給全局對象時。php中的全局變量,對象和引用 - 它們是如何工作的?

考慮以下幾點:

<?php 

$global_obj = null; 

class my_class { 

    var $value; 

    public function __construct() { 
     global $global_obj; 

     $global_obj =& $this; 
     $GLOBALS['some_var'] = $this; 
    } 
} 

$a = new my_class(); 
$a->my_value = 5; 
$global_obj->my_value = 10; 

echo 'A: ' . $a->my_value; //5 
echo '<br />'; 
echo 'Global Object: ' . $global_obj->my_value; //10 
echo '<br />'; 
echo 'Globals Array Value: ' . $some_var->my_value; //5 

?> 

如果去掉符號上面$這個代碼是參考指派到$ global_obj。我的問題是爲什麼在那裏有&符號似乎停止發生

感謝

回答

2

這到底是怎麼發生的是$global_obj是變量$this的參考。 $this是一個僞變量,它存在於作爲對當前對象的引用的方法中。但是,當它超出方法範圍時,誰知道$this會發生什麼。參考$this可能是一個壞主意。實際上,如果您進一步調查一下,在構造函數返回後,如果檢查$global_obj,則其值爲null。該方法退出後,PHP引擎可能會將$this設置爲空(但這在任何地方都沒有記錄),而您的$global_obj,因爲它是對變量$this的引用。當您在null上設置屬性時,它會自動實例化類stdClass的新對象,因此它似乎成功。但當然,這是一個完全不同於$a的對象。