systemadmin.es > Programación > Consecuencias del tipado dinámico de variables (caso en PHP)

Consecuencias del tipado dinámico de variables (caso en PHP)

Viendo el siguiente tweet de Pierre Bourdon me dediqué a ver lo que pasaba:

PHP es de tipado dinámico

PHP es de tipado dinámico

Si lo ejecutamos veremos como es verdad:

# php -r '$a = "2d9"; $a++; $a++; echo $a."\n";'
3

Para analizar el comportamiento deberemos usar la función gettype() para ver el tipo de dato que estamos mostrando:

<?php

$a = '2d9'; echo $a." ".gettype($a)."\n"; 

$a++; echo $a." ".gettype($a)."\n";

$a++; echo $a." ".gettype($a)."\n";

?>

Si lo ejecutamos vemos:

$ php tweet.php
2d9 string
2e0 string
3 double

Por lo tanto, lo que esta ocurriendo es que primero la variable es un string, ya que indicamos el valor entre comillas. Al incrementarlo lo considera un string y sigue el patrón: de 9 pasa a 10, por lo tanto, incremento el siguiente, de d a e.

Al ser un lenguaje de tipado dinámico, al siguiente incremento decide volver a evaluar el tipo de dato que contiene la variable. En este caso, resulta que interpreta que 2e0 es un dos por diez a la cero, por lo tanto 2. Al incrementarlo, el valor es un double (tiene exponente) y su resultado evidentemente 3.

Esto lo podemos criticar o defender: Sí, tiene su lógica, pero resulta evidentemente confuso.

4 comments to “Consecuencias del tipado dinámico de variables (caso en PHP)”

  1. un dos con exponente cero viene siendo uno, con o cual dudo que esa sea la razón. Supongo que simplemente cogerá el dos y obviará el resto del string

  2. Si fuese así no pasaría de 2d9 a 2e0 y por lo tanto el resultado seria 4.

    Con exponente me refiero a “por diez a la”, por lo tanto:

    2e0 = 2*10^0 = 2*1 = 2
    

    Lo corrijo en el post para que quede claro.

    muchas gracias!

  3. Aquí el problema no lo veo en que el tipado sea dinámico sino en que te deje incrementar 1 en una string.

  4. @Diego: esto es muy discutible: Java permite incrementar objetos, por ejemplo (el objeto debe implementar la función)

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>