Foros del Web » Programando para Internet » PHP »

variables globales dentro de funciones..

Estas en el tema de variables globales dentro de funciones.. en el foro de PHP en Foros del Web. que es lo que está "mejor visto" ?? 1) Pasarle variables globales a una función enviándola como parámetro. 2) Usarla dentro de la función, avisando ...
  #1 (permalink)  
Antiguo 06/07/2013, 21:08
 
Fecha de Ingreso: febrero-2010
Mensajes: 132
Antigüedad: 14 años, 1 mes
Puntos: 0
Exclamación variables globales dentro de funciones..

que es lo que está "mejor visto" ??

1) Pasarle variables globales a una función enviándola como parámetro.
2) Usarla dentro de la función, avisando con global $var, evitando así el uso de los parámetros

??

gracias
  #2 (permalink)  
Antiguo 06/07/2013, 21:11
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: variables globales dentro de funciones..

1) Buena practica, mis respetos
2) Pésima practica, ni lo pienses

Lee lo siguiente: http://phptherightway.com/

No se trata de como "vemos" las cosas, sino de hacer bien tu trabajo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 06/07/2013, 21:12
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 13 años, 11 meses
Puntos: 461
Respuesta: variables globales dentro de funciones..

3 evitar en lo posible el uso de variables globales =).

Normalmente si una función necesita un valor externo lo paso como parámetro
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #4 (permalink)  
Antiguo 06/07/2013, 21:17
 
Fecha de Ingreso: febrero-2010
Mensajes: 132
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: variables globales dentro de funciones..

genial graciasss
  #5 (permalink)  
Antiguo 06/07/2013, 21:24
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: variables globales dentro de funciones..

Cita:
Iniciado por carlos_belisario Ver Mensaje
3 evitar en lo posible el uso de variables globales =).

Normalmente si una función necesita un valor externo lo paso como parámetro
Tienes toda la razón, no alcancé a leer bien el primer punto.

Definitivamente es mala idea usar variables globales en todos los contextos posibles, es decir, que se debe evitar su uso a desmedida.

Cita:
1) Buena practica, mis respetos
2) Pésima practica, ni lo pienses
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 15/07/2013, 14:45
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 9 meses
Puntos: 832
Respuesta: variables globales dentro de funciones..

Una pregunta: tengo esta función

Código PHP:
Ver original
  1. function guardar() {
  2.     global $post, $datos_editor, $datos_editor_listas;
  3.     ...

¿Debo hacerlo así?

Código PHP:
Ver original
  1. function guardar($post , $datos_editor , $datos_editor_listas) {
  2.     ...
  #7 (permalink)  
Antiguo 15/07/2013, 14:56
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: variables globales dentro de funciones..

Sí, además cuando invoques la función también deberás pasar los argumentos en dicho orden.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 15/07/2013, 14:57
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 16 años, 11 meses
Puntos: 292
Respuesta: variables globales dentro de funciones..

@metacortex: hola... lo que dices esta bien pero ten en cuenta que las variables globales convierten a la funcion en un procedimiento o sea que... mas bien tu funcion si la traduces "tal cual" seria asi:

Código PHP:
Ver original
  1. function guardar(&$post , &$datos_editor ,&$datos_editor_listas) {
  2.     ...

Y eso respetando el orden de los parámetros...... [ ahi me gano Pate je ] .. lo que te digo es que esos parametros deben ser input-output para que puedas plantear equivalencia excepto que los "output" los saques con return ... aunque en una funcion que solo "guarda" datos seria un boolean indicando exito / fracaso:


Código PHP:
Ver original
  1. function guardar($post ,$datos_editor ,$datos_editor_listas) {
  2.     ...
  3. return $ok;
__________________
Salu2!
  #9 (permalink)  
Antiguo 15/07/2013, 16:50
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 9 meses
Puntos: 832
Respuesta: variables globales dentro de funciones..

Gracias por la explicación amigos. Esta noticia está a punto de descomponerme el estómago porque casi estoy que termino un trabajo largo cuyos archivos están plagados de variables globales. Otra pregunta consecuente y por favor disculpen la joda: ¿Es muy crítica esa vulnerabilidad, así como para tomar acciones inmediatas? Es decir ¿Sería válido o no dejar el asunto así por unos meses, al menos hasta que reuna X conjunto de actualizaciones de la aplicación?.
  #10 (permalink)  
Antiguo 15/07/2013, 17:58
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 16 años, 11 meses
Puntos: 292
Respuesta: variables globales dentro de funciones..

En mi opinion hay cuestiones mas criticas pero esto te puede joder en el sentido de que podria haber colisiones entre distintas librerias / archivos

Si te llegara a pasar... que empiezan a colisionar tus "paquetes", podrias usar Namespace que pues restringiria un poco el alcance de las variables globales. Ya no serian "globales"

Ejemplo: supongamos tienes una libreria... llamada hello_lib.php y tiene variables globales pero tu quieres restringir el impacto a los archivos que sabes la usan porque casualmente tu tienes una funcion que se llama igual en otra libreria u archivo, digamos es la funcion saludar()

// Archivo # 1 que incluye la funcion saludar()

Código PHP:
Ver original
  1. <?php
  2. Namespace Cortesia;  // Incluyes esta linea
  3.  
  4. function saludar(){
  5.     global $saludo;
  6.     $saludo = 'Hola Mundo';
  7. }

Y... preciso tienes otro archivo... que tiene la misma funcion... digamos que este segundo archivo INCLUYE al primero, pero ambos podrian ser incluidos por un tercero... etc

// Archivo # 2 que estamos de malas e incluye la misma funcion saludar() ... observa que fue necesario definir varios "espacios" de trabajo para evitar las colisiones

Código PHP:
Ver original
  1. <?php
  2. Namespace Cortesia {
  3.     Include "hello_lib.php";
  4. }
  5.  
  6. // Espacio de trabajo "Global" ... es como decir que no pertenece a nigun Namespace
  7. Namespace {
  8.     // Otra funcion que se llama saludar y colisionaria
  9.     function saludar($nombre){    
  10.         return "Hola $nombre";
  11.     }
  12. }
  13.  
  14. Namespace Cortesia {
  15.     saludar();  
  16.     echo $saludo;
  17. }


Veamos:

1) Las funciones (podrian ser clases) se pueden llamar igual.. pero la implementacion distinta o no tener nada que ver pero tener el mismo nombre

2) Tu podrias querer "renombrar" la funcion y tener en cuenta todas sus dependientes (donde la llamas) pero... si la o las librerias son "comerciales" ? renombrando estaras en mas problemas porque tu codigo se volvera mucho mas incompatible al momento de actualizarlas.

3) Podras decir...y por que colocas tantos espacios de bloque Namespace ? sera que puedo quitarle el Namespace al include ? RTA: nope. Ese no porque los archivos que tengan Namespace deben comenzar como primera clausula con un Namespace justamente!

Curiosidad... el Namespace "global" equivale a no tenerlo... excepto que aplica la regla de arriba... entonces el codigo que teniamos antes equivale a:

Código PHP:
Ver original
  1. <?php
  2. Namespace Cortesia {
  3.     Include "hello_lib.php";
  4. }
  5.  
  6. // ACA estaba el NAMESPACE GLOBAL  (pero lo quite)
  7.  
  8.     // Otra funcion que se llama saludar y colisionaria
  9.     function saludar($nombre){    
  10.         return "Hola $nombre";
  11.     }
  12.  
  13.  
  14. Namespace Cortesia {
  15.     saludar();  
  16.     echo $saludo;
  17. }


En fin.... no soy un experto... a penas las estoy usando... ojala te solucionen algo

Mas
__________________
Salu2!

Última edición por Italico76; 16/07/2013 a las 06:13
  #11 (permalink)  
Antiguo 16/07/2013, 18:50
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 9 meses
Puntos: 832
Respuesta: variables globales dentro de funciones..

Qué interesante. Ni idea que existía. También creo que parecen clases, pues encapsulan las funciones. Gracias por compartir la información.

Por otra parte te comento que estoy resolviendo el asunto de los parámetros con un pequeño método que compartí en el foro hace tiempo, el cual permite colocarlos en cualquier orden -y hasta de manera más amigable- al invocar la función: http://www.forosdelweb.com/f18/aport...dpress-906484/

Saludos.
  #12 (permalink)  
Antiguo 16/07/2013, 19:03
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 16 años, 11 meses
Puntos: 292
Respuesta: variables globales dentro de funciones..

Cita:
Iniciado por metacortex Ver Mensaje
... estoy resolviendo el asunto de los parámetros con un pequeño método que compartí en el foro hace tiempo, el cual permite colocarlos en cualquier orden -y hasta de manera más amigable- al invocar la función: http://www.forosdelweb.com/f18/aport...dpress-906484/
Me parece bien, esa solucion que encontrastes para vos tiene una Gran ventaja y es que puedes hacer un Search&Replace en algun editor que soporte expresiones regulares como el Notepad++ para las llamadas a esas funciones y solucionar facil tu problema en 5 min a nivel de todo tu codigo. EXCELENTE SOLUCION !!!

Otra forma (la mas usual) de no liarse con el orden de parametros es enviando un array asociativo de los mismos

Supon tenias esto:

Código PHP:
Ver original
  1. function hablar()
  2. {    
  3.     global $sujeto, $accion, $articulo, $objeto;
  4.  
  5.     $articulo = isset($articulo) ? $articulo : null;
  6.  
  7.         return "$sujeto $accion $articulo $objeto";
  8. }
  9.  
  10. $sujeto = 'I';
  11. $accion = 'will eat';
  12. $articulo = 'a';
  13. $objeto = 'cookie';
  14.  
  15. echo hablar();

Fijate lo facil que la adapto:

Código PHP:
Ver original
  1. <?php
  2.  
  3. function hablar ($p)
  4. {    
  5.     if  (!is_array($p)  || (count($p)<3) || (count($p)>4) )
  6.         Throw new InvalidArgumentException("Parametros estan mal en ".__FUNCTION__);
  7.  
  8.     extract($p);  // convierto array en algo retro-compatible
  9.  
  10.     // DE AQUI para abajo tu funcion no cambia en nada ***
  11.     $articulo = isset($articulo) ? $articulo : null;
  12.  
  13.         return "$sujeto $accion $articulo $objeto";
  14. }
  15.  
  16. echo hablar (array('articulo'=>'a','objeto'=>'cookie','sujeto'=>'I','accion'=>'will eat'));

Al mini-chequeo no le des importancia.... solo verifico que sea un array() y que tenga entre 3 y 4 "parametros" puesto que uno de ellos es opcional (articulo)

*** Tu funcion puede tener como invariante "todo" excepto las primeras lineas o primera linea,.. el extract() aunque si tu necesitas devolver "algo" haras un return
__________________
Salu2!

Última edición por Italico76; 17/07/2013 a las 05:31

Etiquetas: globales, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:19.