Forum und email

Tipos de las expresiones

PHP/FI 2.0 usaba el lado izquierdo de las expresiones para determinar el tipo del resultado. PHP 3.0 toma ambos lados en cuenta cuando determina los tipos del resultado, y esto puede producir comportamientos impredecibles si ejecuta scripts 2.0 en 3.0.

Considere este ejemplo:

$a[0]=5;
$a[1]=7;

$clave = key($a);
while ("" != $clave) {
    echo "$clave";
    next($a);
}
En PHP/FI 2.0, esto mostraría los dos índices de $a. En PHP 3.0, no mostraría nada. La razón es que en PHP 2.0, al ser el argumento izquierdo de tipo cadena, se realizaba una comparación de cadenas, y ciertamente "" no es igual a "0", y el ciclo continúa. En PHP 3.0, cuando se compara una cadena con un entero, se realiza una comparación de enteros (la cadena es convertida a entero). Esto resulta en la comparación de atoi("") que es 0, y lista_de_variables que también es 0, y dado que 0==0, el ciclo no avanzará ni una sola vez.

La solución a esto es simple. Reemplace la sentencia while con:

while ((string)$clave != "") {