什麼是型別雜耍

PHP 是一種鬆散型別的語言。這意味著,預設情況下,它不要求表示式中的運算元具有相同(或相容)型別。例如,你可以將一個數字附加到字串並期望它可以工作。

var_dump ("This is example number " . 1);

輸出將是:

string(24)“這是示例 1”

PHP 通過自動將不相容的變數型別轉換為允許所請求的操作發生的型別來實現此目的。在上面的例子中,它將整數文字 1 轉換為一個字串,這意味著它可以連線到前面的字串文字。這被稱為型別雜耍。這是 PHP 的一個非常強大的功能,但它也是一個功能,如果你不瞭解它可以導致你大量的頭髮拉動,甚至可能導致安全問題。

考慮以下:

if (1 == $variable) {
    // do something
}

意圖似乎是程式設計師正在檢查變數的值是否為 1.但是,如果$ variable 的值為 1,則會發生什麼?答案可能會讓你大吃一驚。

$variable = "1 and a half";
var_dump (1 == $variable);

結果是:

布林(真)

為什麼會這樣?這是因為 PHP 意識到字串“1 和半”不是整數,但它需要是為了將它與整數 1 進行比較。而不是失敗,PHP 啟動型別雜耍,並嘗試將變數轉換為整數。它通過將字串開頭的所有字元轉換為整數並轉換它們來完成此操作。它會在遇到不能被視為數字的字元時立即停止。因此,“1 和半”將轉換為整數 1。

當然,這是一個非常人為的例子,但它有助於證明這個問題。接下來的幾個例子將涵蓋一些我遇到由真實軟體中發生的型別雜耍引起的錯誤的情況。