首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 資料型別轉換完整指南:隱式轉換規則、強制轉型三種方式與實戰避坑

     編輯:PHP 相關知識

前言

PHP 是弱型別語言,執行期會根據上下文自動進行型別轉換(隱式轉換),也提供三種強制轉型方式。掌握轉換規則能避開 0 == "abc"、[] == false 等經典陷阱,寫出可預測的程式碼。

八大標量/複合型別

  • 標量:int、float、string、bool
  • 複合:array、object
  • 特殊:null、resource

隱式轉換規則速查表

"10" + "2.5" → 12.510 . 20 → "1020""" → false, "0" → false, [] → false0 == "abc" → true0 === "0" → false
運算/比較情境轉換規則範例結果
算術運算 (+ - * / %)兩邊轉 int/float
字串串接 (.)兩邊轉 string
邏輯判斷 (if/while/?:)轉 bool
鬆散比較 (== !=)依型別組合轉換(見下表)
嚴格比較 (=== !==)不轉換,型別與值皆需相同

鬆散比較 (==) 型別組合轉換規則

類型 1類型 2比較邏輯
null / bool任意轉 bool,false < true
int / floatint / float數值比較
string (純數字)int / float字串轉數值比較
string (非純數字)int / float字串轉 0 比較
stringstring若兩者皆為數字格式 → 數值比較,否則字典序比較
arrayarray鍵值對逐一比較(順序無關)
objectobject同類別屬性比較;不同類別永遠不等
resourceresource資源 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  ⚠️ 極易誤判

鐵律:除非極確定型別,一律使用 === / !==。

三種強制轉型方式

1. 型別轉換運算子 (Casting)

(int) $val
(bool) $val
(float) $val
(string) $val
(array) $val
(object) $val
// 別名:(integer)、(double)、(real)、(boolean)

2. 專用函式

intval($val, $base = 10)   // 可指定進制
floatval($val)
strval($val)
boolval($val)  // PHP 5.5+

3. 通用函式 settype()

settype($var, 'integer'); // 直接修改原變數,回傳 bool
// 可用類型:integer, float, string, boolean, array, object, null

各型別轉換細節

→ int

  • 字串:純數字開頭 → 解析數字;非數字開頭 → 0。"123abc" → 123, "abc123" → 0
  • float:捨去小數 3.9 → 3
  • bool:true → 1, false → 0
  • null:→ 0
  • array:空陣列 → 0,非空 → 1(並觸發 Notice)
  • object:→ 1(觸發 Notice,需實作 __toString)

→ float

  • 字串:同 int 但保留小數 "12.3abc" → 12.3
  • bool/null:同 int

→ string

  • int/float:數字字面值 12 → "12", 12.3 → "12.3"
  • bool:true → "1", false → ""(空字串)
  • null:→ ""
  • array:→ "Array"(觸發 Notice)
  • object:需實作 __toString(),否則 Error

→ bool

  • Falsy 值:false, 0, 0.0, "", "0", [], null
  • 其餘皆為 Truthy(含 [-1], "00", "false", new StdClass())

→ array

  • 標量/資源/null:→ [$val](單元素陣列)
  • object:→ 屬性陣列(可見性影響)

→ object

  • 標量/陣列/資源:→ stdClass,屬性名 scalar 或鍵名
  • null:→ Error

實戰避坑清單

  1. 比較永用 ===:$id === 0 而非 $id == 0。
  2. 檢查字串是否為數字:is_numeric()、ctype_digit()、filter_var($str, FILTER_VALIDATE_INT)。
  3. JSON 解碼型別:json_decode() 預設大數字為 float,大整數用 JSON_BIGINT_AS_STRING。
  4. 資料庫回傳:PDO 預設字串,啟用 PDO::ATTR_EMULATE_PREPARES = false + PDO::ATTR_STRINGIFY_FETCHES = false 保留原生型別。
  5. 表單輸入:filter_input_array(INPUT_POST, ['age' => FILTER_VALIDATE_INT]) 統一驗證並轉型。

PHP 8.0+ 新特性

  • match 表達式:嚴格比較 ===,無隱式轉換。
  • 聯集型別:function foo(int|string $id): bool。
  • ValueError 取代部份轉型失敗的 Warning/Notice。

結語

型別轉換是 PHP 彈性的來源,也是 Bug 溫床。建立「輸入驗證 → 內部強型別 → 輸出格式化」的防禦式編碼習慣,配合 ===、declare(strict_types=1)、PHPStan 靜態分析,即能在享受動態語言效率的同時守住正確性底線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved