PHP 是弱類型語言,變數類型由上下文自動推斷,但深入理解八種原始類型的特性、轉換規則及判斷函數,對編寫健壯代碼至關重要。本文系統梳理標量、複合、特殊類型,並對比 gettype()、is_*、var_dump() 的適用場景。
八大類型總覽
| 分類 | 類型 | 關鍵字 | 說明 |
| 標量類型 | 字串 | string | 字節序列,無長度限制(受記憶體限制) |
| 整數 | int / integer | 平台相關(32/64 位),溢位自動轉 float |
| 浮點數 | float / double | IEEE 754 雙精度,精度約 14 位有效數字 |
| 布林 | bool / boolean | true/false,隱式轉換規則較多 |
| 複合類型 | 陣列 | array | 有序映射,鍵可為 int/string,值任意類型 |
| 物件 | object | 類實例,封裝屬性與方法 |
| 特殊類型 | 資源 | resource | 外部資源句柄(檔案、資料庫連接、流等) |
| 空值 | null | 變數無值、未初始化、已 unset |
類型檢查函數對比
$v = 123.45;
// gettype() - 返回類型字串(歷史原因 float 返回 'double')
echo gettype($v); // "double"
// var_dump() - 顯示類型+值+長度,調試首選
var_dump($v); // float(123.45)
// is_* 系列 - 邏輯判斷專用,效能最佳
is_int($v); // false
is_float($v); // true
is_numeric($v); // true (字串數字也返回 true)
// 類型斷言 (PHP 8.0+)
function foo(int $x): void {}
foo(10); // OK
foo("10"); // TypeError (嚴格模式) / 自動轉換 (弱類型模式)
隱式轉換陷阱與防範
| 場景 | 行為 | 建議 |
== 鬆散比較 | "123abc" == 123 為 true | 嚴格使用 === 比較類型與值 |
| 布林轉換 | 0, "", "0", [], null, false 為 false | 明確使用 isset(), empty(), strlen() 等 |
| 陣列轉字串 | 觸發 Notice "Array to string conversion",結果 "Array" | 使用 implode(), json_encode() |
| 資源類型 | gettype(fopen(...)) 返回 "resource" | is_resource() 判斷,get_resource_type() 獲取具體類型 |
PHP 8.0+ 新特性:聯合類型、混合類型、nullsafe
// 聯合類型參數/返回
function process(int|float|string $val): bool|array {
// ...
}
// mixed 類型 (等同無類型聲明,但可文檔化)
function debug(mixed $data): void {
var_dump($data);
}
// nullsafe 操作符 ?->
$user?->profile?->avatar?->url; // 任一環節為 null 則返回 null,不報錯
實務建議
- 嚴格模式:檔案頂部宣告
declare(strict_types=1); 強制類型檢查。
- 型別聲明:盡可能為函數參數、返回值、類屬性添加類型聲明。
- 避免 gettype() 做邏輯判斷:字串比較慢且易錯,改用
is_int() 等。
- 調試用 var_dump() / debug_zval_dump():查看引用計數、類型、值完整資訊。
- 資源清理:
fclose(), mysqli_close(), curl_close() 釋放 resource,防洩漏。