2010-08-26 15 views
36

¿Hay una mejor práctica/recomendación cuando quiero utilizar una variable declarada fuera de una función cuando se trata de usar:

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

Gracias.

Respuesta

33

Lo que realmente debe hacer es pasar la variable a la función en lugar de usar un global en absoluto.

Un ejemplo cómo cambiar un fuera variable de la función a través de pasarlo como parámetro de referencia:

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

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

Necesito editar una variable externa. – Francisc

+1

@Francisc Si realmente lo desea, puede pasarlo por referencia. – Artefacto

+1

Adjunté un ejemplo para demostrar el uso de una referencia como sugiere Artefacto. –

3

I would go for global en la parte superior de su función. De esta forma, puedes ver fácilmente qué elementos globales se usan.

+2

Excepto cuando la función es larga (por ejemplo, una declaración de cambio grande), y ahora no sabe qué es global y qué no. Puede declarar qué valores globales utiliza con un phpdoc ('@ global'). – Artefacto

3

me Wold decir, se recomienda no utilizar Globals en programación orientada a objetos, siempre debe haber una mejor manera

69

Bueno, sólo se debe utilizar variables globales en circunstancias limitadas, pero para responder a su pregunta:

  1. global es potencialmente ligeramente más rápido (se rar ely hace una diferencia).
  2. $GLOBALS (no $GLOBAL) es más legible, porque cada vez que lo ve, sabe que está accediendo/cambiando una variable global. Esto puede ser crucial para evitar errores desagradables.
  3. Dentro de una función, si desea desarmar una variable global, debe usar unset($GLOBALS['varname']), no global $varname; unset($varname);.

En cuanto a los puntos 1 y 2, voy a quote Sara Golemon aquí:

¿Qué significa eso para su uso de la matriz $GLOBALS? Así es, la palabra clave global es técnicamente más rápida. Ahora, quiero ser muy claro acerca de una cosa aquí. La menor velocidad permitida dada al usar sus globales como [variables compiladas] necesita ser seriamente comparada con la capacidad de mantenimiento de mirar su código en cinco años y sabiendo que $foo provino del alcance global. something_using($GLOBALS['foo']); siempre será más clara a que la línea de global $foo; /* buncha code */ something_using($foo); No sea un centavo sabio y libra tonto ..

+3

Muy útil, gracias. – Francisc

+1

Estoy de acuerdo contigo, $ GLOBALS es mucho mejor que "global" – Stef

+11

+1 por responder la pregunta que se te hizo. Los Globals pueden no ser las mejores prácticas, pero a veces tenemos que trabajar con ellos (WordPress, ¿alguien?). – Mark

0

global $var; es equivalente a $var =& $GLOBALS['var'].

Algunas personas sugirieron que es más rápido que usar $GLOBALS, sin embargo, no es necesariamente el caso. Si usa la variable solo una vez, $GLOBALS será más rápido, porque no perderá tiempo para la asignación.

Sin embargo, si utiliza la variable varias veces, usar global (o la asignación equivalente) es más rápido, ya que busca la matriz para la clave var solo una vez.

Eso es todo sobre la velocidad. Sin embargo, la diferencia de velocidad es realmente pequeña, y la legibilidad es más importante.Sin embargo, diferentes personas tienen diferentes preferencias sobre la legibilidad. Prefiero global, algunas otras personas que responden aquí prefieren $GLOBALS, por lo que depende de ti decidir qué se ve mejor.

+0

Sus dos primeros párrafos son incorrectos. Bueno, el primero es medio equivocado. Es semánticamente equivalente, pero no se traduce a los mismos códigos de operación y 'global $ var' es más rápido que' $ var = & $ GLOBALS ['var'] '.El segundo párrafo es simplemente incorrecto. – Artefacto

+0

@Artefacto: Hm, pensé que eran realmente equivalentes. Gracias por señalarlo, intentaré encontrar más información sobre esto. – Mewp

+1

Como bien, el segundo es incorrecto, ejecute "Código de perfil" en este http://codepad.viper-7.com/roRI8g Verá que 'global' es solo una búsqueda de hash más almacenamiento en una variable compilada. La variante '$ GLOBALS' implica dos búsquedas de hash. No se almacena en ninguna variable, pero no hace ninguna diferencia en comparación con el almacenamiento en una variable compilada, en cuanto al rendimiento. – Artefacto

Cuestiones relacionadas