Forum und email

Ausdruckstypen

PHP/FI 2.0 benutzte die linke Seite von Ausdrücken, um herauszufinden, wie das Ergebnis aussehen soll. PHP 3.0 zieht beide Seiten in Betracht um den Ergebnistypen zu bestimmen. Dies kann bei 2.0 Scripts dazu führen, sich in 3.0 unerwartet zu verhalten.

Betrachten Sie dieses Beispiel:

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

$key = key($a);
while ("" != $key) {
    echo "$keyn";
    next($a);
}
In PHP/FI 2.0 würde dies beide Kennziffern von $a anzeigen. In PHP 3.0 würde gar nichts angezeigt werden. Der Grund ist, dass in PHP 2.0, aufgrund des "linken" Arguments des Strings, ein Vergleich des Strings gemacht wurde, "" ist in der Tat nicht das selbe wie "0", was dazu führt, dass die Schleife durchläuft. Wenn man in PHP 3.0 einen String mit einem Integer vergleicht, so wird ein Vergleich zweier Interger vorgenommen (der String wir in einen Integer umgewandelt). Dies führt dazu, dass atoi(""), was 0 ist, und variablelist, was genauso 0 ist, vergleichen werden. Und weil 0==0, würde die Schleife nicht ein einziges Mal durchlaufen.

Dies zu reparieren ist einfach. Ersetzen Sie das While-Statement mit:

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