2010-05-25 137 views
0

$GLOBALS['current_view']global $current_view,您更喜歡哪種?爲什麼?訪問PHP全局變量的方法

+0

我想你應該問*是什麼,而不是什麼人蔘考的最佳實踐*(即使它們可能是同樣的事情)。 – alex 2010-05-25 02:00:14

+0

@alex實際上有輕微的差異。 – Artefacto 2010-05-25 02:20:50

+0

@Artefacto是的,但我寧願編碼以便最佳實踐,然後互聯網上的某個人*更喜歡*。 – alex 2010-05-25 02:27:18

回答

10

既不將參數傳遞給方法。每當你使用全局變量時,神會殺死一隻小貓。

3

如果我必須使用全局變量,並且我避免他們像瘟疫一樣,我使用全局$ current_view。我只是喜歡總是有一個局部範圍的變量,而不是依賴於超級全局變量。但我認爲它是一個偏好問題。

3

個人而言,我更喜歡$GLOBALS['glob']語法,因爲我可以複製粘貼代碼而不必擔心將變量聲明爲全局變量。請記住,你應該儘量保持全局最小化(也許只是全局配置指令,甚至是......)。

但是,這兩種方法並不完全是同義的;有一點點區別:

function func() { 
    var_dump($GLOBALS['glob']); 
} 

function func2() { 
    global $glob; 
    var_dump($glob); 
} 

如果全局'glob'不存在,第一個會發出通知。第二個不會。

在第一種情況下,發送$GLOBALS['glob']作爲參數編譯爲:

 3  FETCH_R      global    $0  'GLOBALS' 
    4  FETCH_DIM_R          $1  $0, 'glob' 

你取GLOBALS及其在讀上下文索引glob;沒有變量被創建。

第二個編譯成

 compiled vars: !0 = $glob 
    ... 
    2  FETCH_W      global lock   $0  'glob' 
    3  ASSIGN_REF            !0, $0 

你正在創建全球glob的引用,因此如果它不存在,它是隱式創建。

另外:

function func_unset() { 
    unset($GLOBALS['glob']); 
} 

function func2_unset() { 
    global $glob; 
    unset($glob); 
} 

功能func()實際上會清除全球,func2_unset只會破壞所創建的參考。

注意func2非常相似:

function func3() { 
    $glob =& $GLOBALS['glob']; 
} 

這是一個潛在但是效率較低。它編譯成

 2  FETCH_W      global    $0  'GLOBALS' 
    3  FETCH_DIM_W          $1  $0, 'glob' 
    4  ASSIGN_REF            !0, $1 
0

靜態類FTW

class View { 
    private static $current = null; 
    public static function get_current() { 
     return self::$current; 
    } 
}