2010-08-26 9 views
36

est-il une meilleure pratique/recommandation quand je veux utiliser une variable déclarée en dehors d'une fonction en ce qui concerne l'utilisation:

  1. global $myVar
  2. $GLOBALS['myVar']

Je vous remercie.

Répondre

33

Ce que vous devez vraiment faire est de passer la variable à la fonction au lieu d'utiliser une approche globale du tout.

Un exemple comment changer une variable en dehors de la fonction via le passant comme paramètre de référence:

function myFunc(&$myVar) 
{ 
    $myVar = 10; 
} 

$foo = 0; 
myFunc($foo); 
var_dump($foo); // yields 10 
+3

Je dois éditer une variable externe. – Francisc

+1

@Francisc Si vous le voulez vraiment, vous pouvez le transmettre par référence. – Artefacto

+1

J'ai joint un exemple pour démontrer en utilisant une référence comme Artefacto suggéré. –

3

Je pencherais pour mondiale dans le haut de votre fonction. De cette façon, vous pouvez facilement voir ce que les globales sont utilisés.

+2

Sauf lorsque la fonction est longue (par exemple une grande déclaration de commutateur), et maintenant vous ne savez pas ce qui est global et ce qui ne l'est pas. Vous pouvez déclarer les globals que vous utilisez avec un phpdoc ('@ global'). – Artefacto

3

Je Wold dis, il est recommandé de ne pas utiliser Globals dans POO, il devrait toujours être une meilleure façon

69

Eh bien, vous ne devez utiliser globals dans des circonstances limitées, mais pour répondre à votre question:

  1. global est potentiellement un peu plus rapidement (il rar faire une différence).
  2. $GLOBALS (non $GLOBAL) est plus facile à lire, parce que chaque fois que vous le voyez, vous savez que vous accédez à/changer une variable globale. Cela peut être crucial pour éviter les bogues désagréables.
  3. l'intérieur d'une fonction, si vous voulez désinitialiser une variable globale, vous devez utiliser unset($GLOBALS['varname']), non global $varname; unset($varname);.

Quant aux points 1 et 2, je vais quote Sara Golemon ici:

Qu'est-ce que cela signifie pour votre utilisation du tableau $GLOBALS? C'est vrai, le mot-clé global est techniquement plus rapide. Maintenant, je veux être très clair sur une chose ici. L'importance de la vitesse mineure donnée par l'utilisation de vos variables globales en tant que [variables compilées] doit être sérieusement mise en balance avec la maintenabilité de regarder votre code dans cinq ans et sachant que $foo venait de la portée globale. something_using($GLOBALS['foo']); aura toujours plus clair pour vous que la ligne global $foo; /* buncha code */ something_using($foo); Ne pas sou-sage et livre stupide ..

+3

Très utile, merci. – Francisc

+1

Je suis d'accord avec vous, $ GLOBALS est beaucoup mieux que "global" – Stef

+11

+1 pour répondre à la question qui a été posée. Les globals ne sont peut-être pas des bonnes pratiques mais parfois nous devons travailler avec eux (WordPress, n'importe qui?). – Mark

0

global $var; est équivalent à $var =& $GLOBALS['var'].

Certaines personnes ont suggéré qu'il est plus rapide que d'utiliser $GLOBALS, mais ce n'est pas forcément le cas. Si vous n'utilisez la variable qu'une seule fois, $GLOBALS sera plus rapide, car vous ne perdrez pas de temps pour l'affectation. Toutefois, si vous utilisez plusieurs fois la variable, l'utilisation de global (ou l'affectation équivalente) est plus rapide, car recherchez une seule fois le tableau pour la clé var.

C'est tout pour la vitesse. Cependant, la différence de vitesse est vraiment faible et la lisibilité est plus importante.Cependant, différentes personnes ont des préférences différentes en matière de lisibilité - je préfère global, d'autres personnes qui répondent ici préfèrent $GLOBALS, donc c'est à vous de décider ce qui a l'air le mieux.

+0

Vos deux premiers paragraphes sont faux. Eh bien, le premier est à moitié faux. C'est sémantiquement équivalent, mais ils ne se traduisent pas par les mêmes opcodes et 'global $ var' est plus rapide que' $ var = & $ GLOBALS ['var'] '.Le deuxième paragraphe est tout simplement faux. – Artefacto

+0

@Artefacto: Hm, je pensais qu'ils étaient vraiment équivalents. Merci d'avoir signalé cela, je vais essayer de trouver plus d'informations à ce sujet. – Mewp

+1

Quant à bien, le second est faux, exécutez "Code de profil" sur ce http://codepad.viper-7.com/roRI8g Vous verrez que 'global' est juste une recherche de hachage plus le stockage dans une variable compilée. La variante '$ GLOBALS' implique deux recherches de hachage. Il n'est stocké dans aucune variable, mais cela ne fait aucune différence par rapport au stockage dans une variable compilée, en termes de performances. – Artefacto

Questions connexes