¿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.
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.
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por JuniHH el 25 de Julio de 2012
if ( !$foo )
{
//
}
Por Carlos Cárdenas el 25 de Julio de 2012
Por Aijoona el 25 de Julio de 2012
http://nikic.github.com/2012/07/10/What-PHP-5-5-might-look-like.html
Por Freddie el 25 de Julio de 2012
Carlos Cárdenas-blog :
Tal como dije Aijoona arriba, PHP admite que es una mala implementación y lo corregirán en PHP5.5. Es de esas cosas que no tiene justificación. Esté en los docs o no.
Por Yaraher el 25 de Julio de 2012
Por ejemplo, si quiero hacer lo mismo en Ruby:
hey_there = ""
hey_there.empty?
#=> true
hey_there = "OMG"
hey_there.empty?
#=> false
Es lógico y no tengo que verificar si una función o no se comporta como creo yo, o de otra manera. Simplemente lo hace.
Por Carlos Cárdenas el 25 de Julio de 2012
vamos.. yo lo veo como por ejemplo.. si quisiéramos usar el api de facebook.. ahh ps obtengo mis publicaciones con graph.facebook.com/me/timeline... es intuitivo pero resulta ser que no.. es con /feed/..
pero bueno.. en mi carrera he visto como se programan y disenan los lenguajes y es una tarea muy laboriosa y siempre va a haber detalles que se escapan y que con el paso del tiempo se solucionan o parchan... y tal ves es tiempo que PHP cambie un poco esa función...
Por Freddie el 25 de Julio de 2012
Carlos Cárdenas-blog :
Por Yaraher el 25 de Julio de 2012
Cada lenguaje tiene un propósito y un fin. Lenguajes de alto nivel como Python o Ruby se enfocan más en servir al desarrollador y optimizar ese tiempo de creación. Otros pueden ser en velocidad y optimización (C/ASM, etc)., y es tarea ya nuestra elegir lo que mejor se nos preste.
Como bien dices, el Graph de Facebook también tiene problemas, pero eso no quiere decir que esté "bien" o que la respuesta sea simplemente leer la documentación. Claro, ayuda y es fundamental, pero también es señal que podrían hacer un mayor esfuerzo en tener una interfaz más limpia.
Por Carlos Cárdenas el 25 de Julio de 2012
Es bueno mejorar las interfases en pro para nuestro trabajo .. claro... siempre y cuando sin descuidar la eficiencia y el rendimiento... y pensar en tantas formas en que a los desarrolladores "se les pueda ocurrir" como utilizar los lenguajes.. entonces eso llega a afectar un poco en los tiempos de interpretación...
Por Josue el 25 de Julio de 2012
Por Freddie el 25 de Julio de 2012
Josue-blog :
Por NEO_JP el 25 de Julio de 2012
Por razones como estas amo Javascript y Node.js
Por The Fricky! el 25 de Julio de 2012
Por Freddie el 25 de Julio de 2012
The Fricky! :
¿Lo has testeado así? Creo que es un caso diferente a simplemente tener que declarar antes de usar.
Por zerohours el 25 de Julio de 2012
Creo que cualquier lenguaje de programación va a dar error cuando tratas de evaluar una variable que no has definido.
Por Freddie el 25 de Julio de 2012
zerohours :
Creo que cualquier lenguaje de programación va a dar error cuando tratas de evaluar una variable que no has definido.
empty() es una función que determina si el contenido que le pasas por parametro está vacío o no. Debería dar "true" si se le pasa un string vacío. Sea el return de una función o una variable directa. Todos los lenguajes de alto nivel comparables con PHP (.NET, Python, Ruby, Java) aceptan pasos de valores por referencia y por valor en estos casos. PHP en cambio, debido a una mala implementación del empty que exige usar isset, sólo soporta variables declaradas.
Eso es un error y la misma gente de PHP lo ha aceptado, lo arreglarán en PHP5.5
Por JoseAlejandro_Realza el 25 de Julio de 2012
Por The Fricky! el 25 de Julio de 2012
Freddie :
The Fricky! :
¿Lo has testeado así? Creo que es un caso diferente a simplemente tener que declarar antes de usar.
No, no, creo que no me expliqué bien. Yo sólo me refiero a la necesidad de declarar variables que comentaba Neo_JP, no tiene que ver con el problema (que es, de hecho, un problema de diseño en el lenguaje) de empty() en PHP. El strict mode de Javascript no es muy diferente de lo que usan los lenguajes estrictamente tipados.
Por Freddie el 25 de Julio de 2012
Por Maikel el 25 de Julio de 2012
saludos
Por Maikel el 25 de Julio de 2012
Por Freddie el 25 de Julio de 2012
Maikel :
saludos
Por edge el 25 de Julio de 2012
p.d.: Lo dice un Python developer.
Por Freddie el 25 de Julio de 2012
edge :
p.d.: Lo dice un Python developer.
empty(), sea función o construcción/instrucción del lenguaje, es un metodo cuyo retorno es si algo tiene un valor vacío o no. Genera error con retornos de función por una mala implementación de composición con isset, que no debería tener nada que ver y será cambiado en PHP 5.5, admitido por los propios developers de PHP.
¿Cómo no va a ser un error de implementación en el diseño del lenguaje?
Por edge el 25 de Julio de 2012
2. Me cuesta creer que sea admitidio por los propios developers. Si fuera un error, ya se hubiera implementado una funcion nueva hace mas de 3 anios, y se hubiera puesto en deprecated la funcion en mencion. Pues no ha sido asi. Enhacement es diferente a error.
3. Bah, no se si llamarlo error, muy dramatico el termino para algo que esta bien documentado. Muy pronto aparecera "empty() works with function calls (and other expressions)" hasta que despues haya gente chillando que se debe expandir la funcion nuevamente.
En conclusion, pon tu variable declarada y listo, muy pronto (meses?) recibira tu callback y tendras q crear un topic: "una nueva maravilla de PHP"
Por Pablo Morales el 26 de Julio de 2012
Por ThonyFD el 26 de Julio de 2012
Carlos Cárdenas-blog :
Tengo años desarrollando en JAVA y nunca he tenido que ver la documentación por algo como esto... simplemente un lenguaje de programación debe ser una herramienta para crear soluciones no para crearle problemas al programador
Por Jordi el 26 de Julio de 2012
Que tal si hacemos if ( ! vacio() ) {}?
Freddie, te respeto enormemente, eres un hombre sabio, pero empiezan a cansarme tus ganas de denigrar PHP. Sigue esperando a que django despegue (y cree una documentación decente) mientras los chicos de PHP siguen sacando actualizaciones de lenguage que duplican el rendimiento de las aplicaciones (Benchmark en PHP 5.4) o aportan nuevas mejoras del lenguage (traits, namespaces, built-in Webserver....).
Un saludo...
Por Dano el 26 de Julio de 2012
Este tema me recordo a este, chequenselo por si no lo han visto:
http://stackoverflow.com/questions/1995113/strangest-language-feature
El gran ganador es JS, si de cosas "raras" hablamos.
Por masterojitos el 26 de Julio de 2012
Nota. Creo que no se trata de leer o no toda la documentación para saber como funciona cada cosa en PHP, pero también hay que tener en cuenta que claramente en la "primera linea" indica: empty — Determina si una variable está vacía.
En fin... al igual que en el anterior comentario de Jordi (y es algo que muchos lo saben y dicen)... es algo molesto ver que aprovechas cada oportunidad que tienes para tumbar PHP... osea... "Cagadas de PHP" ??? Creo que hay que ver lo bueno y no lo malo... lo malo se mejora... no se denigra
Saludos
Por Daniel el 26 de Julio de 2012
Se me ocurren mil maneras diferentes y muchísimo más ortodoxas de hacer esa comprobación, además si empty trabaja SOLO con variables, es lo más lógico que haga un isset, y si no existe devolver directamente false (y no iniciar la rutina de comprobación, leer memoria, etc) optimización.
Un buen programador programa con lo que sea, y renegar de un lenguaje o una tecnología en particular te convierte en cualquier cosa pero menos en un buen programador.
Saludos, deja un poco el geek show y codea más si te gusta, porque el que mucho abarca poco aprieta. Un saludo, me gusta tu programa y la iniciativa, pero frena un poco la moto porque te la vas a dar...
Por negus_sadrak el 26 de Julio de 2012
Saludos.
Por Maikel el 26 de Julio de 2012
ThonyFD :
Carlos Cárdenas-blog :
Tengo años desarrollando en JAVA y nunca he tenido que ver la documentación por algo como esto... simplemente un lenguaje de programación debe ser una herramienta para crear soluciones no para crearle problemas al programador
El lenguaje más aclamado por todos los programadores es C y está lleno de cosas como estas. Así que, si no lees la documentación es un problema ético tuyo, no del lenguaje.
saludos
Por ramir el 28 de Julio de 2012
Por Maikel el 29 de Julio de 2012
saludos
Por ramir el 30 de Julio de 2012
Por torrealbaruben el 30 de Julio de 2012
pd: No soy programador pero leo de programación.
Por Fox el 31 de Julio de 2012
Por Linnk el 31 de Julio de 2012
if(empty($string = vacio())) { }
empty() es una función de muy bajo nivel (de esas joyas de PHP, precisamente) y es perfecto para cuando, aun si el tipo de datos es dinámico, te importa el tipo de datos.
Por Otaku RzO el 01 de Agosto de 2012
@freddie dice: "empty es una función que devuelve verdadero si el valor que se le pasa por parametro está vacío."
@PHP dice: "Determina si una variable es considerada vacía." y "empty() sólo comprueba variables ya que cualquier otra cosa producirá un error de análisis." (Extraído de Función empty).
Por Freddie el 02 de Agosto de 2012
Otaku RzO :
@freddie dice: "empty es una función que devuelve verdadero si el valor que se le pasa por parametro está vacío."
@PHP dice: "Determina si una variable es considerada vacía." y "empty() sólo comprueba variables ya que cualquier otra cosa producirá un error de análisis." (Extraído de Función empty).
Sí, la documentación dice eso. Ese no es el punto. El punto es que si programas en 10 lenguajes diferentes al día y toodooos tienen una función "empty" que funciona con variables o con retornos de función y sólo la de PHP requiere una variable predeclarada en el ambito de invocación, ¿Entonces todos los lenguajes están mal o esto es un error de diseño en PHP?
¿Y si los mismos devs de PHP admiten que es un error de diseño y que lo arreglarán en el próximo parche?
¿Ves que, bajo estas condiciones, no importa lo que diga la documentación? No se trata que esté documentado o no, sino que es un error de diseño del lenguaje. Ese es el punto del post.
Por Otaku RzO el 03 de Agosto de 2012
Me quedo claro que la discusión va por ese punto. Pero quisiera resaltar un punto en la redacción del post:
Título: "Joyas de PHP: empty() sólo funciona en variables declaradas".
Más abajo dice: "empty es una función que devuelve verdadero si el valor que se le pasa por parametro está vacío, falso si tiene algo.".
Por el contexto entendí que definías la función "empty" de PHP y creo que tu intensión era empezar diciendo: "En la mayoría de lenguajes de programación, empty es una función que devuelve verdadero si el valor que se le pasa por parametro está vacío, falso si tiene algo.". Con eso me quedaba super claro y ya no discutí sobre la propia función empty en PHP.
Por Linnk el 03 de Agosto de 2012
Por Freddie el 03 de Agosto de 2012
Linnk-blog :
Por Francisco el 30 de Noviembre de 2012
Si creo un lenguaje y creo una función sumarUno(), nadie me puede recriminar de porqué no sumo 2.
Por DieFeM el 22 de Diciembre de 2012
$marca = "nissan";
if ( !empty($marca) ){
echo $marca;
}
esto en segun que version me devuelve nissan y en segun que version el condicional no se cumple, por lo que tube que usar :
if ( $marca != "" ) ){
echo $marca;
}
para que funcione siempre.
Por KEVIN el 21 de Abril de 2014
quiza
Por Fer el 13 de Mayo de 2016