La función de PHP isset () falla

Tengo un problema con la función isset de PHP. A menudo y misteriosamente (para mí) falla.

Por ejemplo, cuando tengo una variable que puede ser una cadena o una matriz de error, bash usar isset para ver si la variable contiene uno de los índices conocidos de la matriz, así:

$a = "72"; if(isset($a["ErrorTable"])) echo "YES"; else echo "NO"; 

Este chico malo imprime SÍ todo el camino en mi servidor. Lo probé en Ideone (cosa de intérprete en línea. ¡Es genial!) Aquí: http://ideone.com/r6QKhK y se imprime NO.

Estoy pensando que esto tiene algo que ver con la versión de PHP que estamos usando. ¿Alguien puede arrojar algo de luz sobre esto?

Considere la siguiente pieza de código:

 $a = "72"; var_dump( isset($a["ErrorTable"]) ); 

Está comprobando si $a["ErrorTable"] está configurado. PHP primero convierte cualquier desplazamiento no numérico a int y esto hace que ErrorTable sea ​​igual a 0 .

Esencialmente, solo lo estás haciendo:

 if ( isset($a[0]) ) 

A las cadenas en PHP se puede acceder a una matriz, y $a[0] definitivamente se establece y la condición se evaluará a TRUE .

Sin embargo, este extraño comportamiento se corrigió en PHP 5.4.0 y el registro de cambios para isset() dice:

5.4.0 – Comprobar los desplazamientos no numéricos de cadenas ahora devuelve FALSO.

Su servidor probablemente esté usando una versión anterior de PHP y eso explicaría por qué produce YES .


Puede usar array_key_exists() lugar:

 $a = "72"; if ( is_array($a) && array_key_exists('ErrorTable', $a) ) { echo 'YES'; } else { echo 'NO'; } 

La salida será NO en todas las versiones de PHP.

Usualmente uso la función vacía como:

 $a = "72"; if(!empty($a["ErrorTable"])) echo "YES"; else echo "NO"; 

$ a [0] es una forma de hacer referencia al primer carácter de la cadena, que es el valor “7”. Debido a que los caracteres de cadena simplemente se referencian por su valor numérico, el “ErrorTable” se encasilla en un int (0)

Este es el caso en PHP 5.2.17 y 5.3.23, pero no en 5.4.15 o 5.5.0