martes, diciembre 08, 2009

PHP No sabe sumar




Leyendo feeds encontré un viejo post de Facundo Batista donde dice que PHP No sabe sumar:
$r = 3 + 058;
echo $r."\n";
?>
Ese código en PHP imprime "8".

WTF?! Esta es una de esas cosas que me hacen sentir FURIA, IRA, MUERTE, PESTE, DESTRUCCIÓN MASIVA. ¿Cómo es que alguien en su sano juicio va a hacer semejante idiotez?

El error está en que el número 058 intenta interpretarse como un octal, pero no es válido (el 8 no es un dígito octal!) y el número se trunca hasta el ultimo dígito válido. El "058" se interpreta como "05".

Buscando en bugs.php.net encontré un reporte de bug del año 2004 en donde se menciona este bug, y la única respuesta fue:
I once looked into fixed this, but this would slow down PHP dramatically in all cases where numbers are used inside scripts. Hence it's not worthwhile to "fix" this.

Veamos de vuelta... en una versión relativamente moderna de PHP (5.2.6) qué pasa...
$ php5 -r "echo 3 + 058 . \"\\n\";"
8
$ php5 -v
PHP 5.2.6-1+lenny3 with Suhosin-Patch 0.9.6.2 (cli) (built: Apr 26 2009 22:16:23)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    with XCache v1.2.2, Copyright (c) 2005-2007, by mOo
    with Suhosin v0.9.27, Copyright (c) 2007, by SektionEins GmbH

Ya está. Si alguien quiere seguir programando en ese lenguaje de mala muerte, yo avisé!

Hay una página llamada PHPWTF.org en donde se juntan otras de estas joyitas ...

Ahora, ¿qué pasa en Python?

>>> 3 + 058
  File "", line 1
    3 + 058
          ^
SyntaxError: invalid token

¡OH SI! y tal como dice Facundo en su post:
"Ningún error debería pasar silenciosamente", dice el Zen de Python.

Por favor, no usen PHP. Usen Python. Ruby. Java. Lo que sea, pero por favor, basta de usar PHP.

2 comentarios:

Angel dijo...

Hay un serio problema: PHP sobre Apache es mucho mas rápido que Python o Ruby. mod_passenger y mod_wsgi (o mod_python) son magnitudes mas lentos que mod_php en Apache.

Me paso dos veces en el año de tener aplicaciones desarrolladas en Python (una con mod_python, y otra usando django que corría sobre mod_wsgi) y tuve que reescribirlas en PHP por temas de performance (Puedo escuchar a muchos diciendo “o la herejía” pero lamentablemente es cierto, con Python no andaban y con PHP si).

Se que con el ambiente correcto y un servidor dedicado, esto puede ser a la inversa normalmente. Pero en muchas situaciones (la mayoría) PHP se presenta como una solución mas adecuada que Python.

¿Es feo? Si. ¿Tiene muchos bugs? Y que los digas. ¿Agregaron goto a la ultima versión? Parece un chiste pero es cierto. ¿Anda donde otros no? Lamentablemente si.

alejolp dijo...

Eso depende de MUCHOS factores, pero en reglas generales y lamentablemente es cierto.

Con una buena configuración PHP no solo anda bastante rápido sino que a veces es la única opción. Lighttpd con PHP en FastCGI anda a las chapas.