Ver Mensaje Individual
  #5 (permalink)  
Antiguo 11/03/2008, 08:45
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: variables superglobales pros y contras

A ver, estamos hablando de cosas diferentes.

Por un lado tenemos matrices superglobales predefinidas. Esto quiere decir que estarán disponibles en cualquier parte del script. Automáticamente son declaradas como globales. (a saber: $_SERVER, $_POST, $_FILES, $_GET, $_SESSION, $_ENV, $_COOKIES, $GLOBALS, $_REQUEST).

Si register_globals está en ON, los índices de las matrices EGPCS (Entorno, GET, POST, Cookie, Servidor) pasarán a ser variables propiamente dichas. Ese es el gran problema de seguridad que más arriba refieren.

La pregunta específica es como hacer que una variable global del script esté también disponible en el ámbito local de una función o un objeto. Esto no tiene que ver directamente con el uso de register_globals. Hay varias formas de hacerlo. Una compleja (no porque sea difícil, sino porque hay que incluirla en cada función del script) y que ya no se recomienda, es hacerla global dentro de cada función de tu script:

Código PHP:
function algo() {
    global 
$variable1$variable2;
    
# ....

Otra, más sencilla, es usando una de las matrices superglobales que te mencioné arriba. La matriz $GLOBALS contiene referencias a todas y cada una de las variables definidas en el contexto global del script. Podrías usarla para llamar a las variables deseadas:

Código PHP:
function algo() {
    echo 
$GLOBALS['variable1'];
    echo 
$GLOBALS['variable2'];
    
# ....

Algunas cosas que aclarar. La matriz $GLOBALS es automáticamente definida como global, independientemente del valor de register_globals. SIn embargo hay otras directivas en el php.ini que pueden impedir que esta variable sea definida automáticamente como global. Además, como dije más arriba, esta matriz contiene puras referencias. Esto quiere decir que cualqueir cambio aplicado a cualquiera de sus elementos será en realidad aplicado a la variable original:

Código PHP:
$v "a";
 
function 
dd() {
    
$GLOBALS['v'] = "b";
}
 
echo 
$v# a
 
echo "<br>";
 
dd();
 
echo 
$v# b 
Saludos,