2009-12-15 19 views
6

¿Hay alguna manera de hacer que todas las variables sean globales?Hacer todas las variables globales, PHP

+31

Por favor, no :( –

+1

Si no es práctico establecer una variable global en una función genérica, siempre puede utilizar la matriz $ GLOBALS (es decir, $ GLOBALS ['var_name']) – Bretticus

Respuesta

9

No importa lo que trates de hacer, pero esta es una mala manera de hacerlo. Sería mucho mejor simplemente pasar variables como argumentos a funciones o declararlas globales allí.

pero, en resumen, no hay una manera simple de hacerlo sin muchas declaraciones globales.

8

manera rápida y sucia:

$GLOBALS += get_defined_vars(); 

no sé si este truco es portátil (funciona en PHP 5.3.1) y sospecho que los objetos se clonan.

+1

El objeto no debe clonarse , pero no funciona con aliasing. Pero diría que es bastante cercano, y otras cosas tienen más sobrecarga: http://stackoverflow.com/a/10980563/367456 (Se agregó la respuesta por razones de exhaustividad) – hakre

5

creo que esto puede ayudar a foreach($GLOBALS as $name => $value) global $$name; ponerlo dentro de la función y tendrás todas las variables visibles definidas

15

Para importar todas las variables globales incl. superglobales y se enfrentaron nombres de parámetros en el ámbito funciones:

extract($GLOBALS, EXTR_REFS | EXTR_SKIP); 

El problema es con el superglobals aquí. Es posible que desee excluirlos, aquí hay una lista (PHP 5.2):

/** 
* PHP Superglobals 
*/ 
array (
    1 => 'GLOBALS', 
    2 => '_ENV', 
    3 => 'HTTP_ENV_VARS', 
    4 => '_POST', 
    5 => 'HTTP_POST_VARS', 
    6 => '_GET', 
    7 => 'HTTP_GET_VARS', 
    8 => '_COOKIE', 
    9 => 'HTTP_COOKIE_VARS', 
    10 => '_SERVER', 
    11 => 'HTTP_SERVER_VARS', 
    12 => '_FILES', 
    13 => 'HTTP_POST_FILES', 
    14 => '_REQUEST', 
    15 => 'HTTP_SESSION_VARS', 
    16 => '_SESSION', 
) 

Usted recibe los nombres de variables con el parámetro get_defined_vars.

Esa es también la razón por la que lo opuesto es menos complicado, get_defined_vars no devuelve los superglobales, solo las variables locales.

El global crea una referencia a la variable del ámbito global, por lo que en realidad es una variable local que es un alias de la variable global con el mismo nombre. También algunos VARs locales están chocando a exportar, por lo que algunos pre-precauciones como nombres de variables esotéricos deben tomarse:

foreach(get_defined_vars() as ${"\x00\x00"} => ${"\x00\x01"}) 
{ 
    $GLOBALS[${"\x00\x00"}] =&$${"\x00\x00"}; 
} 

Tenga en cuenta que les gusta globals la $GLOBALS gama superglobal contiene referencias a las variables globales, así que esto crea referencias aquí también. Esto es especialmente necesario si importa a través de global o &$GLOBALS[...] o extract como se indica arriba. O si tiene variables locales que son alias de los miembros de la clase privada (no hagas eso;)):

Ejemplo/Demo:

<?php 
/** 
* Make all variables global, PHP 
* @link http://stackoverflow.com/q/1909647/367456 
*/ 
error_reporting(~0); 

function bar($goo = 1) 
{ 
    global $foo; 

    $foo++; 
    $baz = 3; 

    foreach(get_defined_vars() as ${"\x00\x00"} => ${"\x00\x01"}) 
    { 
     $GLOBALS[${"\x00\x00"}] =&$${"\x00\x00"}; 
    } 
} 

$foo = 1; 
bar(); 
echo '$goo: ', var_dump($goo); # int(1) 
echo '$foo: ', var_dump($foo); # int(2) 
echo '$baz: ', var_dump($baz); # int(3) 
+2

Eres un valiente valiente ;-) +1 – PeeHaa

2

Usted Puede sencilla a hacer una referencia a $ GLOBALS

foreach($GLOBALS as $k => $v) 
    $$k=&$GLOBALS[$k]; 

Explicación del código:

$ GLOBLAS es una VA superglobal riable (visible en todas partes).Básicamente, que contiene todas las variables


$$ significa que la variable con el nombre del valor de la variable que escribió

poco raro de explicar en un idioma extranjero así que aquí está un ejemplo:

$color='blue'; 
$blue='foo'; 

echo $$color; 

es la salida

foo 

$k=& $v; 

significa que $ k es una referencia a $ v

0

Esto no es realmente una buena práctica para hacer todas las variables globales con respecto a la seguridad. Para agregar variables como globales, deberá agregar la palabra clave GLOBAL cada vez que vaya a acceder. El enfoque alternativo es el uso de la matriz $ GLOBAL.

Cuestiones relacionadas