2010-04-03 15 views
5

Tengo una pregunta sobre la inicialización de la variable global.isset() y variable global de PHP

function hello_testing() { 
    global $conditional_random; 
    if (isset($conditional_random)) { 
     echo "foo is inside"; 
    } 
} 

La variable global (conditional_random) no puede ser inicializado antes de la función hello_testing() se llama.

Entonces, ¿qué ocurre con mi validación a través de isset() cuando $conditional_random no está inicializado? ¿Fallará o siempre será cierto?

+0

En una nota lateral trate de mantenerse alejado del mundo. Es una señal segura del código de espagueti –

+1

@Manos. Estoy de acuerdo, pero si se desarrolla en la comunidad de Wordpress (como un ejemplo) es más o menos imposible mantenerse alejado de las variables globales o de una serie de otras malas convenciones. En mi opinión, si estás trabajando con PHP en primer lugar, te has resignado a tolerar las malas prácticas de codificación y solo necesitas conocer formas relativamente seguras de trabajar con lo que tienes. –

Respuesta

9

Bueno, ¿por qué no acaba de prueba? ;-)

Nota: No es tan fácil como se podría pensar - leer la respuesta completa ;-)


Llamar a la función hello_testing();, sin establecer la variable:

hello_testing(); 

No obtengo salida, lo que indica isset devuelto false.


Llamar a la función, después de ajustar la variable:

$conditional_random = 'blah'; 
hello_testing(); 

consigo una salida:

foo is inside 

Lo que indica global funciona como se espera, cuando la variable se establece - así , uno no debería tener ninguna duda sobre eso ^^



pero tenga en cuenta que isset regresará false si se establece una variable, y null!
Ver las manual page of isset()

Lo que significa que una prueba mejor sería:

function hello_testing() { 
    global $conditional_random; 
    var_dump($conditional_random); 
} 

hello_testing(); 

y esto muestra:

null 

Sin Aviso: la variable existe! Incluso si null.

Como no establecer la variable fuera de la función, que muestra que globalconjuntos la variable - pero no pone un valor en ella; lo que significa que es null si no está ya configurado fuera de la función.


bien:

function hello_testing() { 
    //global $conditional_random; 
    var_dump($conditional_random); 
} 

hello_testing(); 

Da:

Notice: Undefined variable: conditional_random 

demuestra que las notificaciones están habilitadas ;-)

Y, si no lo hizo mundial " establecer" la variable , el ejemplo anterior habría dado el mismo aviso.


Y, por último:

function hello_testing() { 
    global $conditional_random; 
    var_dump($conditional_random); 
} 

$conditional_random = 'glop'; 
hello_testing(); 

Da:

string 'glop' (length=4) 

(Puramente para demostrar mi ejemplo no es engañado ^^)

+1

¿Entonces su 'prueba' es para ver si se activa un aviso? Si bien la explicación de cómo isset funciona es buena, esto no parece proporcionar una alternativa útil. – Omn

-1

Global establece la variable. Por lo tanto, isset($some_globald_variable) siempre devolverá verdadero.

La mejor opción es empty()

if(empty($globald_variable)) 
{ 
// variable not set 
} 
+0

no quiero sonar como un asno :) pero olvidaste un paréntesis en tu declaración 'if' :) – Gabriel

+5

La variable se crea, pero se inicializa como nula. isset devuelve falso dado una variable con un valor nulo. – goat

+0

@goat es correcto, esta respuesta es incorrecta –

6

usted puede comprobar para ver si el global se ha creado comprobando si la clave existe en $ GLOBALES:

echo array_key_exists('fooBar', $GLOBALS)?"true\n":"false\n"; 
//Outputs false 

global $fooBar; 

echo array_key_exists('fooBar', $GLOBALS)?"true\n":"false\n"; 
//Outputs true 

echo isset($fooBar)?"true\n":"false\n"; 
//Outputs false 

Esta es la única forma que conozco para comprobar la existencia de un mundial sin trigging una advertencia.

Como mencionó Manos Dilaverakis, debe evitar usar globos globales siempre que sea posible.

Cuestiones relacionadas