Arreglando la función vacía de PHP
Pregunta
PHP tiene el hábito de evaluar (int) 0 y (cadena) " 0 " como vacío cuando se utiliza la función empty ()
. Esto puede tener resultados no deseados si espera valores numéricos o de cadena de 0. ¿Cómo puedo " corregir " ¿Solo devuelve verdadero a objetos vacíos, matrices, cadenas, etc.?
Solución
Esto no funcionó para mí.
if (empty($variable) && '0' != $variable) {
// Do something
}
He usado en su lugar:
if (empty($variable) && strlen($variable) == 0) {
// Do something
}
Otros consejos
Raramente uso empty ()
por la razón que describe. Confunde los valores legítimos con el vacío. Tal vez sea porque hago mucho trabajo en SQL, pero prefiero usar NULL
para denotar la ausencia de un valor.
PHP tiene una función is_null ()
que prueba si una variable o expresión es NULL
.
$foo = 0;
if (is_null($foo)) print "integer 0 is null!\n";
else print "integer 0 foo is not null!\n";
$foo = "0";
if (is_null($foo)) print "string '0' is null!\n";
else print "string '0' is not null!\n";
$foo = "";
if (is_null($foo)) print "string '' is null!\n";
else print "string '' is not null!\n";
$foo = false;
if (is_null($foo)) print "boolean false is null!\n";
else print "boolean false is not null!\n";
También puedes usar el operador exactamente igual a ===
para hacer una prueba similar:
if ($foo === null) print "foo is null!\n";
Esto es cierto si $ foo
es NULL
, pero no si es false
, cero, " " , etc.
" 0 " siempre se considera falso ( o vacío) en PHP, y tiene mucho sentido (no es que lo discutiré aquí). Si también desea que cero evalúe como verdadero, use strlen ($ value)
.
" Fijación " Es un punto de vista. Otro sería asumir que no está "roto" y aprender a trabajar con él de la forma en que fue diseñado intencionalmente.
Dado el problema tal como lo describe, lo mejor sería ajustar su código para que la variable no pueda ponerse en un estado de tipo indeterminado. De lo contrario, querrá probar el tipo de datos utilizando gettype ().
Siempre agrego a mi código base
function is_blank($value) {
return empty($value) && !is_numeric($value);
}
y úsalo en lugar de vacío (). Resuelve el problema de mantener los ceros (int, float o string) como no vacíos.
Consulte http://www.php.net/manual/en /function.empty.php#103756 que se agregó en mayo de 2011.
En términos generales, desea utilizar el operador de triple igual para determinar cuándo un valor es realmente nulo o falso. Esto es más específico y los resultados SIEMPRE se devuelven exactamente como se esperaba.
Crear una función separada para hacer algo que puede hacer en una sola línea de código, pero usar un operador diferente parece ser demasiado complicado y agrega una ofuscación adicional.
Además, muchos programadores tienden a usar 0 o una cadena vacía para denotar un valor inexistente, pero es más correcto (y creo que es una mejor práctica) usar un valor nulo para denotar cualquier valor (independientemente del tipo) que es verdaderamente inexistente.
Uso esto para detectar el vacío:
'' --> true
'0' --> false
0 --> false
la función:
function is_empty_or_zero($str) {
return (is_null($str) || ($str === ''));
}
Creé una IsEmpty ()
una función rápida tersa.
function IsEmpty($mData) {
return is_int($mData) ? false :
is_string($mData) ? $mData=="" :
empty($mData);
}
Estás intentando utilizar empty ()
para algo para lo que no está destinado. Personalmente, creo que su comportamiento proviene de un viejo paradigma de programación en PHP y probablemente podría retirarse.
En cambio, haz tus cheques más explícitos. En lugar de verificar si el valor no es útil, verifique que lo sea. Por ejemplo, si desea una matriz, verifique que sea una matriz ( is_array ()
) en lugar de verificar si es una cadena.
Además, puede confiar en el hecho de que todas las variables $ _POST
y $ _GET
son cadenas, por lo que puede hacer comparaciones en " " ;, o verificar que strlen () == 0
.
if ( is_int($val) || !empty($val) ) {;}
Utilicé la función ord
para verificar el valor pasado estaba vacío o no.
/*
* SPACE is not empty - Please do trim before using this function for your own purpose
* var_dump(is_having_value(0)); // true
var_dump(is_having_value(0000)); // true
var_dump(is_having_value(" 0")); // true
var_dump(is_having_value("")); // false
var_dump(is_having_value(" ")); // true
var_dump(is_having_value('\t')); // true
var_dump(is_having_value('')); // false
var_dump(is_having_value('o')); // true
var_dump(is_having_value('O')); // true
var_dump(is_having_value('0')); //true
var_dump(is_having_value(null)); //false
var_dump(is_having_value()); //false
*/
function is_having_value($val = null) {
if (is_array($val) || is_object($val)):
$logic_empty = empty($val);
return !$logic_empty;
else:
$ascii = ord($val);
if ($ascii == 48 || $ascii = 0 || $ascii == 32):
return true;
else:
$logic_empty = empty($val);
return !$logic_empty;
endif;
endif;
}
La solución más efectiva para este problema es probar si la variable es falsa, por ejemplo,
if (!$variable_name) {echo $variable_name;}
No importa si la variable está vacía o nula, todo es igual a falso cuando se coloca en un condicional.