2010-02-07 11 views
16

siento que soy un principiante y no puedo determinar cuán buena es esta pregunta, tal vez suene completamente obvio para algunos de ustedes.La ventaja/desventaja entre las variables globales y los parámetros de función en PHP?

si nuestro uso de estos dos a continuación es el mismo que es mejor?

function doSomething ($var1,$var2,..){ 
    ... 
} 

O

function doSomething(){ 
    global $var1,$var2,..; 
    ... 
} 

por nuestro uso quiero decir que sé que en el segundo escenario también podemos alterar el valor de las variables globales. pero ¿y si no necesitamos hacer eso, que es la mejor manera de escribir esta función? ¿Las variables que pasan toman menos memoria que anunciar globales en una función?

+2

Además de los motivos por los que no se usa "global" en las respuestas a continuación, considere también la posibilidad de reutilización de códigos. Si, por ejemplo, tiene un archivo de funciones de utilidad, entonces en cualquier script que incluya ese archivo, debe asegurarse de que los nombres de sus variables coincidan con las variables globales en esas funciones. Esto puede ser problemático, especialmente con un script complejo. O si desea refactorizar una secuencia de comandos "conectando" una función ya existente, entonces deberá verificar todo el código de la secuencia de comandos, incluso el código que no pertenece a la función, para asegurarse de que no haya conflictos de nomenclatura. – GZipp

+0

Me gustaría agregar que también podría considerar agregar la declaración de variable global fuera de su función, pero esto todavía es una mala práctica, porque alguien más puede no saber si están importando su código. Es posible que no se den cuenta de que están importando esa variable global y crean otra variable con el mismo nombre, anulando así su original. – imagineerThat

Respuesta

19

El uso de memoria es una preocupación insignificante. Es mucho más importante que el código sea fácil de seguir y no tenga ... resultados imprevistos ... Agregar variables globales es una IDEA MUY MALA desde este punto de vista, IMO.

Si usted está preocupado por el uso de memoria, lo que hay que hacer es

function doSomething (&$var1, &$var2,..) { 
    ... 
} 

Esto pasará las variables por referencia y no crear nuevas copias de los mismos en la memoria. Si los modifica durante la ejecución de la función, esas modificaciones se reflejarán cuando la ejecución regrese a la persona que llama.

Sin embargo, tenga en cuenta que es muy inusual incluso que esto sea necesario por razones de memoria. La razón habitual para usar la referencia por referencia es por la razón que mencioné arriba (modificándolos para la persona que llama).El camino a seguir es casi siempre la sencilla

function doSomething ($var1, $var2) { 
    ... 
} 
+0

que era un punto que me faltaba, cuando nuestro código comienza a crecer teniendo los parámetros de funciones, es útil saber qué función va a utilizar la función. – Mohammad

+0

Si $ var1 y $ var2 son variables de solo lectura, no consumirían más memoria. Lectura adicional sobre las variables y referencias de PHP: http://derickrethans.nl/talks/phparch-php-variables-article.pdf – Dor

4

Escríbela para tomar los parámetros. La capacidad de mantenimiento es mucho más importante que la micro-optimización. Cuando toma parámetros, las variables no se pueden modificar en lugares inesperados.

12

Evite el uso de variables globales, utilice las variables de pase en el enfoque de parámetros en su lugar. Dependiendo del tamaño de su programa, el rendimiento puede ser insignificante.

Pero si usted está preocupado con el rendimiento aquí hay algunas cosas importantes a tener en cuenta sobre global variable performance con respecto a las variables locales (variables definidas dentro de las funciones.)

  • Incrementar una variable global es 2 veces lenta que una var .
  • Simplemente declarar una variable global sin utilizarla en una función también ralentiza las cosas (en aproximadamente la misma cantidad que el incremento de una var local). PHP probablemente hace una comprobación para ver si el global existe.

Además, las variables globales aumentan el riesgo de utilizar valores incorrectos, si se alteraron en otro lugar dentro de su código.

+0

enlace y la información es más que útil, me gustaría también podría marcar la suya como la respuesta correcta, ya que es. – Mohammad

1

Pase los parámetros, evite los globales. Mantener solo el alcance que necesita para una situación determinada es una medida de buen diseño del código. Es posible que desee ver en PHP ámbito de las variables ...

http://php.net/manual/en/language.variables.scope.php

Un excelente recurso, con algunas indicaciones de lo que es las mejores prácticas y la gestión de memoria.

2

Aunque no es una buena práctica, siempre y cuando usted garantiza que el mundial no está escrito, pero sólo lectura tendrá la flexibilidad de los parametros.

Como alternativa, puede pasar un parámetro (o dos si realmente va con la función, como exp) y el resto en una matriz de opciones (un poco como jquery). De esta manera no está utilizando globales, tiene flexibilidad de parámetros y ha definido claramente los valores predeterminados para cada parámetro.

function get_things($thing_name,$opt= array() { 
    if(!isset($opt["order"])) $opt["order"]= 'ASC'; 
} 
1

A partir de PHP 4 utilizando global con grandes variables afecta significativamente el rendimiento.

Teniendo en datos de una cadena $ 3Mb con datos de los mapas binarios y correr 10k pruebas si el bit es 0 ó 1 para diferente uso global da los siguientes resultados: tiempo

function getBit($pos) { 
global $data; 
$posByte = floor($pos/8); 
... 
} 

poco t5 abiertos: 0.05495s, buscar: 5.04544s, todo: 5.10039s

function getBit($data) { 
global $_bin_point; 
$pos = $_bin_point; 
$posByte = floor($pos/8); 
} 

t5 bits abiertos: 0.03947s, busque: 0.12345s, todo: 0.16292s

function getBit($data, $pos) { 
$posByte = floor($pos/8); 
... 
} 

t5 bit abierto: 0.05179s, buscar: 0.08856s, todos: 0.14035s

Por lo tanto, pasar los parámetros es mucho más rápido que usar global en las variables> = 3Mb. No se ha probado al aprobar una referencia de datos de $ & y no se ha probado con PHP5.

Cuestiones relacionadas