PHP 提供一組 is_* 函數用於運行時類型檢查,掌握它們的適用範圍與邊界條件,能避免「以為是整數實則是字串」等隱性 Bug。
| 函數 | 判斷目標類型 | 返回 true 示例 | 返回 false 示例 |
|---|---|---|---|
is_bool() | 布林值 | true, false | 1, "true", 0 |
is_int() / is_integer() | 整數 | 42, -5, 0 | "42", 3.14, true |
is_float() / is_double() / is_real() | 浮點數 | 3.14, -0.5, 1.0 | "3.14", 42 |
is_string() | 字串 | "hello", "", "123" | 123, true, null |
is_array() | 陣列 | [1,2], ['a'=>1] | new ArrayObject, "[]" |
is_object() | 對象 | new StdClass, new MyClass | [1,2], "obj" |
is_numeric() | 數字或純數字字串 | 42, -3.14, "42", "3.14", "0xFF" | "42px", "hello", [] |
is_scalar() | 標量類型 (int/float/string/bool) | 1, 1.0, "a", true | [1], new Obj, null |
is_callable() | 可調用結構 | 'strlen', [$obj,'method'], fn()=>1 | 'not_exist', [1,2] |
is_iterable() | 可迭代 (PHP 7.1+) | [1,2], new Generator, new ArrayIterator | 1, "str", new StdClass |
is_null() | null 值 | null | 0, "", false, [] |
is_resource() | 資源類型 | fopen(), curl_init() | null, 1, "res" |
is_numeric() vs is_int()$vals = [123, "123", 12.3, "12.3", "123abc", "0xFF"];
foreach ($vals as $v) {
echo var_export($v, true) . " => ";
echo "is_int: " . (is_int($v) ? 'T' : 'F') . " ";
echo "is_numeric: " . (is_numeric($v) ? 'T' : 'F') . "\n";
}
/* 輸出
123 => is_int: T is_numeric: T
'123' => is_int: F is_numeric: T ← 字串數字通過 is_numeric
12.3 => is_int: F is_numeric: T
'12.3' => is_int: F is_numeric: T
'123abc' => is_int: F is_numeric: F
'0xFF' => is_int: F is_numeric: T ← 十六進制字串也算 numeric
*/
// 1. 嚴格整數檢查(拒絕字串數字)
function isStrictInt($v) { return is_int($v); }
// 2. 寬鬆整數檢查(接受字串數字、浮點整數)
function isLooseInt($v) { return is_numeric($v) && (string)(int)$v === (string)$v; }
// 3. 類型斷言風格(PHP 8.0+)
function process(int|string $id): void { /* ... */ }
// 4. 避免隱式轉型陷阱
if ($_POST['age'] === '25') { /* 字串比較 */ }
if ((int)$_POST['age'] === 25) { /* 強制轉型後比較 */ }
is_integer() 是 is_int() 別名,功能完全相同。is_numeric() 對十六進制 (0xFF)、二進制 (0b101)、科學記數法 (1e3) 字串均返回 true。ctype_digit() 僅檢查字串是否全為數字字符,不接受 整數變量,需先 (string)$v。is_resource()) 在 PHP 8.0+ 部分遷移為對象 (如 GD 圖片、Curl handle),舊代碼需注意。善用 gettype()、get_debug_type() (PHP 8.0+) 進行調試輸出,配合嚴格類型聲明 (declare(strict_types=1)),能在開發期攔截絕大多數類型不匹配問題。