Forum und email

Tipi di espressione

PHP/FI 2.0 usava il lato sinistro delle espressioni per determinare di che tipo dovesse essere il risultato. PHP 3.0 considera entrambi i lati quando determina il tipo del risultato, e questo può causare un comportamento inaspettato degli script 2.0 sulla versione 3.0.

Si consideri questo esempio:

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

$key = key($a);
while ("" != $key) {
    echo "$keyn";
    next($a);
}
In PHP/FI 2.0, questo visualizzerebbe entrambi gli indici di $a. In PHP 3.0, invece, non visualizza nulla. Il motivo è che in PHP 2.0, siccome il tipo del'argomento sinistro è una stringa, viene fatta una comparazione fra stringhe, e "" non è uguale a "0", quindi la condizione è verificata. In PHP 3.0, quando una stringa è comparata con un intero, viene eseguita una comparazione tra intera (la stringa è convertita in intero). Questo provoca una comparazione tra atoi("") che è 0, e variablelist che è pure 0, e siccome 0==0, la condizione del ciclo non è mai verificata.

La soluzione è semplice. Sostituire l'espressione while con:

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