Ver Mensaje Individual
  #4 (permalink)  
Antiguo 23/04/2003, 15:17
josemi
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Ese concepto de usar !$opcion o $opcion para saber si existe una variable es erroneo y es una mala practica que debe abandonarse. Es una de las cargas que se debe al origen de PHP, pero bueno, basta de lamentaciones y vayamos a la explicacion.

Primero, por que esta mal. Incluso PHP te da un mensaje de error, bueno un NOTICE de los que solo se ven si tenemos configurado PHP para que muestre todo tipo de mensaje de error. Da un NOTICE: se intento acceder a una variable no definida. Pero supongamos que lo tenemos desactivado, que nos importa un comino los NOTICE. Probad estos codigos:
Código PHP:
<?php
$opcion
=0;
if (!
$opcion) {
    echo 
"\$opcion no esta definida<br>";
} else {
    echo 
"\$opcion vale $opcion<br>";
}
// o
$opcion=false;
if (!
$opcion) {
    echo 
"\$opcion no esta definida<br>";
} else {
    echo 
"\$opcion vale $opcion<br>";
}
// o
$opcion=NULL;
if (!
$opcion) {
    echo 
"\$opcion no esta definida<br>";
} else {
    echo 
"\$opcion vale $opcion<br>";
}
// o
$opcion='';
if (!
$opcion) {
    echo 
"\$opcion no esta definida<br>";
} else {
    echo 
"\$opcion vale $opcion<br>";
}
?>
En ambos casos $opcion esta definida, pero muestra el mensaje de no definida. ¿Por que? Porque !$opcion devuelve true cuando $opcion se evalua a false. Y PHP evalua a false los valores 0, false, NULL y cadena vacia ('').

Por eso lo correcto para comprobar si existe una variable es usar la funcion isset():
Código PHP:
<?php
if (!isset($opcion)) {
    echo 
"\$opcion no esta definida<br>";
} else {
    echo 
"\$opcion vale $opcion<br>";
}
$opcion=0;
if (!isset(
$opcion)) {
    echo 
"\$opcion no esta definida<br>";
} else {
    echo 
"\$opcion vale $opcion<br>";
}
// o
$opcion=false;
if (!isset(
$opcion)) {
    echo 
"\$opcion no esta definida<br>";
} else {
    echo 
"\$opcion vale $opcion<br>";
}
// o
$opcion=NULL;
if (!isset(
$opcion)) {
    echo 
"\$opcion no esta definida<br>";
} else {
    echo 
"\$opcion vale $opcion<br>";
}
// o
$opcion='';
if (!isset(
$opcion)) {
    echo 
"\$opcion no esta definida<br>";
} else {
    echo 
"\$opcion vale $opcion<br>";
}
?>
En este caso sale el mensaje de no definida en el primer caso (cuando no esta definida) y cuando tiene el valor NULL.

Y quizas entonces os pregunteis por que tambien funciona (error de concepto) !$opcion para detectar que la variable no existe. Por la "facilidad" de uso de PHP. Cuando intentas acceder a una variable que no esta definida, PHP manda el NOTICE y "da" a la variable el valor NULL, con lo que !NULL es true y por eso funciona.

Espero haberme explicado bien y que a partir de ahora useis isset() para mirar si esta definida una variable.

Saludos.

PD: ya no tengo saliva para lo del include(), pero creo que la descripcion del manual era bastante clara.
__________________
Josemi

Aprendiz de mucho, maestro de poco.