jueves, 26 de julio de 2012

Joyas de PHP: empty() sólo funciona en variables declaradas

Joyas de PHP: empty() sólo funciona en variables declaradas: ¿Alguna vez les ha salido este error programando en PHP y no tienen idea qué pasó?

Fatal error: Can't use function return value in write context in ...



PHP es de los lenguajes más usados del mundo. De los más exitosos en adopción y probablemente el más veloz para distribuir e implementar en servidores. Pero también uno de los más criticados y lleno de detalles especiales.


El error que ven es común, pero realmente difícil de depurar. Ocurre al usar las funciones isset o empty de PHP en algo que no sea una variable declarada. empty es una función que devuelve verdadero si el valor que se le pasa por parametro está vacío, falso si tiene algo. Pero por la razón que sea, la gente de PHP decidió implementarlo internamente usando "isset", que detecta primero si una variable está declarada, tenga o no algo por dentro.

Cómo "empty" genera el "Fatal error, can't use function return..."


Un ejemplo sencillo, esto funciona:
Código :
<?php
function vacio()
{
   return "";
}
$nada = vacio();
echo empty( $nada );
?>

Retorna un valor vacío dentro de la variable $nada y la función empty devuelve 1, porque es verdad que está vacío.

Pero esto no funciona:
Código :
<?php
function vacio()
{
   return "";
}
echo empty( vacio() );
?>

Y devuelve el
Fatal error: Can't use function return value in write context in line 7.

De hecho, incluso esto no funciona, cuando cambiamos el retorno por un valor que no es vacío.
Código :
<?php
function vacio()
{
   return "python";
}
echo empty( vacio() );
?>

Generando también error.

¿Solución? Usen una simple comparación de si el retorno es igual a un string vacío cuando necesiten usar una función, en vez de usar empty() como debería ser. Porque PHP es especial.

[nota:79d2a85ce6]Este errorcito de PHP me costó un par de horas de arreglar en bug en Cristalab. La buena noticia es que, si eres usuario de Cristalab, a partir de ahora las notificaciones funcionan hermoso y nunca generarán conflicto.[/nota:79d2a85ce6]
Enviar comentario

No hay comentarios:

Publicar un comentario