表達式類型

PHP/FI 2.0 根據表達式左邊判斷表達式的類型,而 PHP 3.0 則根據表達式兩邊進行判斷。這便可能導致 2.0 下運行標準的腳本在 3.0 下導致異常。

考慮以下例子:

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

$key = key($a);
while ("" != $key) {
    echo "$keyn";
    next($a);
}

在 PHP/FI 2.0 中,這段程式將顯示所有 $a 的索引,而在 PHP 3.0 中,這個程式什麼都不會現實。原因是,在 PHP 2.0 中,因為左邊參數的類型是 string,於是,一個 string 的關係便建立起來。當然 "" 並不等於 "0",迴圈從頭到尾。而在 PHP 3.0 中,當一個 string 和一個 integer 比較時,將 string 轉換為 integer 並比較。結果是比較值為 0atoi(""),和同樣是值為 0variablelist,也就是 0==0。所以迴圈根本沒有執行。

很容易修正它。把 while 聲明置換為:

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