Para aquellos interesados, he ampliado este tema en un pequeño artículo, que proporciona la siguiente información en una forma algo mejor estructurada: La guía definitiva para isset And empty de PHP
En mi humilde opinión, deberías pensar no solo en hacer que la aplicación sea "compatible con E_NOTICE", sino en reestructurar todo. Tener cientos de puntos en su código que regularmente intentan usar variables inexistentes suena como un programa bastante mal estructurado. Intentar acceder a variables inexistentes nunca debería suceder, otros lenguajes se resisten a esto en tiempo de compilación. El hecho de que PHP te permita hacerlo no significa que debas hacerlo.
Estas advertencias están ahí para ayudarlo , no para molestarlo. Si recibe una advertencia "¡Está intentando trabajar con algo que no existe!" , tu reacción debería ser "Vaya, mi error, déjame arreglar eso lo antes posible". ¿De qué otra manera va a diferenciar entre "variables que funcionan bien sin definir" y código honestamente incorrecto que puede conducir a errores graves ? Esta es también la razón por la que siempre, siempre , desarrolla con informes de errores en 11 y sigue trabajando en su código hasta que noNOTICE
se emite un . La desactivación de los informes de errores es solo para entornos de producción, para evitar la fuga de información y proporcionar una mejor experiencia de usuario incluso frente a códigos defectuosos.
Elaborar:
Siempre necesitará isset
o empty
en algún lugar de su código, la única forma de reducir su ocurrencia es inicializar sus variables correctamente. Dependiendo de la situación, hay diferentes formas de hacerlo:
Argumentos de la función:
function foo ($bar, $baz = null) { ... }
No hay necesidad de comprobar si $bar
o $baz
se establece dentro de la función, ya que acaba de establecer ellos, todo lo que necesita es preocuparse por si sus evalúa el valor de true
u false
(o cualquier otra cosa).
Variables regulares en cualquier lugar:
$foo = null;
$bar = $baz = 'default value';
Inicialice sus variables en la parte superior de un bloque de código en el que las va a usar. Esto resuelve el !isset
problema, asegura que sus variables siempre tengan un valor predeterminado conocido, le da al lector una idea de en qué funcionará el siguiente código y, por lo tanto, también sirve como una especie de auto-documentación.
Matrices:
$defaults = array('foo' => false, 'bar' => true, 'baz' => 'default value');
$values = array_merge($defaults, $incoming_array);
Lo mismo que antes, está inicializando la matriz con valores predeterminados y sobrescribiéndolos con valores reales.
En los casos restantes, digamos una plantilla en la que está generando valores que pueden o no ser establecidos por un controlador, solo tendrá que verificar:
<table>
<?php if (!empty($foo) && is_array($foo)) : ?>
<?php foreach ($foo as $bar) : ?>
<tr>...</tr>
<?php endforeach; ?>
<?php else : ?>
<tr><td>No Foo!</td></tr>
<?php endif; ?>
</table>
Si lo usa regularmente array_key_exists
, debe evaluar para qué lo está usando. La única vez que marca la diferencia es aquí:
$array = array('key' => null);
isset($array['key']); // false
array_key_exists('key', $array); // true
Sin embargo, como se indicó anteriormente, si está inicializando correctamente sus variables, no necesita verificar si la clave existe o no, porque sabe que existe. Si usted está recibiendo la matriz de una fuente externa, el valor más probable es que no sea null
pero ''
, 0
, '0'
, false
o algo parecido, es decir, un valor que se puede evaluar con isset
o empty
, dependiendo de su intención. Si establece regularmente una clave de matriz en null
y quiere que no signifique nada false
, es decir, si en el ejemplo anterior los resultados diferentes de isset
y array_key_exists
hacen una diferencia en la lógica de su programa, debe preguntarse por qué. La mera existencia de una variable no debería ser importante, solo su valor debería ser de importancia. Si la clave es una bandera true
/ false
, utilicetrue
o false
nonull
. La única excepción a esto serían las bibliotecas de terceros que quieran null
significar algo, pero como null
es tan difícil de detectar en PHP, todavía tengo que encontrar una biblioteca que haga esto.