PHP 八大原始類型
| 分類 | 類型 | 關鍵字 | 說明 |
| 標量類型 | 字符串 | string | 字節序列,無長度限制 |
| 整數 | int / integer | 平台相關長度 (通常 64 位) |
| 浮點數 | float / double | IEEE 754 雙精度 |
| 布爾 | bool / boolean | true / false |
| 複合類型 | 數組 | array | 有序映射,鍵可為 int/string |
| 對象 | object | 類實例 |
| 特殊類型 | 資源 | resource | 外部資源句柄 (文件、DB 連線等) |
| 空值 | null | 無值,未初始化變量默認 |
類型檢測函數對比
| 函數 | 返回值 | 適用場景 | 注意事項 |
gettype($var) | 類型字符串 | 調試輸出 | float 返回 "double";非邏輯判斷首選 |
var_dump($var) | 輸出類型+值 | 開發調試 | 包含長度、引用標記、遞歸保護 |
is_int($var) 等 is_* 系列 | bool | 邏輯分支判斷 | 不觸發類型轉換,效能最佳 |
get_debug_type($var) (PHP 8+) | 更精確類型名 | 現代調試 | 區分 class 名、資源類型、可調用對象 |
實戰代碼示例
<?php
$vars = [
'str' => 'hello',
'int' => 42,
'float'=> 3.14,
'bool' => true,
'arr' => [1,2,3],
'obj' => new stdClass(),
'res' => fopen('php://memory', 'r'),
'null' => null,
];
echo "=== gettype() ===\n";
foreach ($vars as $k => $v) {
echo "$k: " . gettype($v) . "\n";
}
echo "\n=== is_* 系列判斷 ===\n";
$test = 123;
if (is_int($test)) {
$test += 4; // 安全執行加法
}
echo "Result: $test\n"; // 127
// 類型轉換陷阱
var_dump((int)'123abc'); // int(123) - 截取前導數字
var_dump((bool)[]); // bool(false) - 空數組為 false
var_dump((string)123.45); // string(6) "123.45"
類型聲明 (PHP 7+)
// 參數與返回類型聲明
function add(int $a, int $b): int {
return $a + $b;
}
// 嚴格模式 (文件頂部宣告)
declare(strict_types=1);
add(1.5, 2); // TypeError: Argument must be int, float given
// 可空類型 (PHP 7.1+)
function find(int $id): ?User { /* ... */ }
// 聯合類型 (PHP 8.0+)
function format(int|float $num): string { /* ... */ }
// mixed 類型 (PHP 8.0+)
function dump(mixed $var): void { var_dump($var); }
最佳實踐總結
- 判斷邏輯用
is_*:is_int()、is_array()、is_callable() 等,語義清晰、無副作用
- 調試用
var_dump() / get_debug_type()
- 函數簽名加類型聲明:提升可讀性、IDE 支援、運行時檢查
- 嚴格模式
declare(strict_types=1):新專案強烈建議啟用,避免隱式轉換 Bug
- 資源類型:操作完及時
fclose()、mysqli_close() 釋放