PHP 是弱型別語言,執行期會根據上下文自動進行型別轉換(隱式轉換),也提供三種強制轉型方式。掌握轉換規則能避開 0 == "abc"、[] == false 等經典陷阱,寫出可預測的程式碼。
int、float、string、boolarray、objectnull、resource| 運算/比較情境 | 轉換規則 | 範例結果 |
|---|---|---|
| 算術運算 (+ - * / %) | 兩邊轉 int/float | |
| 字串串接 (.) | 兩邊轉 string | |
| 邏輯判斷 (if/while/?:) | 轉 bool | |
| 鬆散比較 (== !=) | 依型別組合轉換(見下表) | |
| 嚴格比較 (=== !==) | 不轉換,型別與值皆需相同 |
| 類型 1 | 類型 2 | 比較邏輯 |
|---|---|---|
| null / bool | 任意 | 轉 bool,false < true |
| int / float | int / float | 數值比較 |
| string (純數字) | int / float | 字串轉數值比較 |
| string (非純數字) | int / float | 字串轉 0 比較 |
| string | string | 若兩者皆為數字格式 → 數值比較,否則字典序比較 |
| array | array | 鍵值對逐一比較(順序無關) |
| object | object | 同類別屬性比較;不同類別永遠不等 |
| resource | resource | 資源 ID 數值比較 |
var_dump(0 == "ads"); // true (字串轉 0)
var_dump(0 == "0.0"); // true
var_dump("0" == false); // true (字串 "0" 轉 bool 為 false)
var_dump("" == false); // true
var_dump([] == false); // true
var_dump([1] == true); // true
var_dump(null == false); // true
var_dump("abc" == 0); // true ⚠️ 極易誤判
鐵律:除非極確定型別,一律使用 === / !==。
(int) $val
(bool) $val
(float) $val
(string) $val
(array) $val
(object) $val
// 別名:(integer)、(double)、(real)、(boolean)
intval($val, $base = 10) // 可指定進制
floatval($val)
strval($val)
boolval($val) // PHP 5.5+
settype($var, 'integer'); // 直接修改原變數,回傳 bool
// 可用類型:integer, float, string, boolean, array, object, null
"123abc" → 123, "abc123" → 03.9 → 3true → 1, false → 0"12.3abc" → 12.312 → "12", 12.3 → "12.3"true → "1", false → ""(空字串)__toString(),否則 Errorfalse, 0, 0.0, "", "0", [], null[-1], "00", "false", new StdClass())[$val](單元素陣列)stdClass,屬性名 scalar 或鍵名$id === 0 而非 $id == 0。is_numeric()、ctype_digit()、filter_var($str, FILTER_VALIDATE_INT)。json_decode() 預設大數字為 float,大整數用 JSON_BIGINT_AS_STRING。PDO::ATTR_EMULATE_PREPARES = false + PDO::ATTR_STRINGIFY_FETCHES = false 保留原生型別。filter_input_array(INPUT_POST, ['age' => FILTER_VALIDATE_INT]) 統一驗證並轉型。match 表達式:嚴格比較 ===,無隱式轉換。function foo(int|string $id): bool。ValueError 取代部份轉型失敗的 Warning/Notice。型別轉換是 PHP 彈性的來源,也是 Bug 溫床。建立「輸入驗證 → 內部強型別 → 輸出格式化」的防禦式編碼習慣,配合 ===、declare(strict_types=1)、PHPStan 靜態分析,即能在享受動態語言效率的同時守住正確性底線。