2010-05-25 6 views
0

$GLOBALS['current_view'] et global $current_view, que préférez-vous et pourquoi?Méthodes d'accès aux variables globales PHP

+0

Je pense que vous devriez demander * quelle est la meilleure pratique * par opposition à ce que les gens font référence (même si elles pourraient être la même chose). – alex

+0

@alex Il existe en fait de légères différences. – Artefacto

+0

@Artefacto Oui, mais je préférerais coder la meilleure pratique, alors ce que quelqu'un sur Internet * préfère *. – alex

Répondre

10

Vous ne pouvez pas non plus transmettre les paramètres aux méthodes. Chaque fois que vous utilisez des globals, Dieu tue un chaton.

3

Si je dois utiliser des globals, et je les évite comme la peste, j'utilise global $ current_view. Je préfère simplement avoir une variable localement limitée plutôt que de compter sur des super globales. Mais je pense que c'est une question de préférence.

3

Personnellement, je préfère la syntaxe $GLOBALS['glob'] parce que je peux simplement copier coller le code sans avoir à se soucier de déclarer les variables comme globales. Gardez à l'esprit que vous devriez essayer de garder les globales à un minimum (peut-être juste des directives de configuration globales, et même là ...).

Cependant, les deux méthodes ne sont pas exactement synonymes; il y a une légère différence:

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

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

Le premier émet un avis si le global « glob » n'existe pas. Le second ne le sera pas.

Dans le premier cas, l'envoi $GLOBALS['glob'] comme argument pour compile:

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

Vous aller chercher GLOBALS et son indice glob dans un contexte de lecture; aucune variable n'est créée.

Le second rassemble à

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

Vous créez une référence à la glob mondiale, il est donc créé implicitement si elle n'existe pas.

aussi:

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

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

La fonction func() sera effectivement unset mondial, func2_unset va simplement détruire la référence qui a été créé.

Notez que func2 est très similaire à:

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

Celui-ci est cependant potentiellement moins efficace. Il compile à

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

classes statiques FTW

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