| 特性 | isset() | array_key_exists() |
|---|---|---|
| 檢查目標 | 變數是否存在且非 null | 陣列鍵名是否存在(值可為 null) |
| 回傳值 | bool | bool |
| 適用對象 | 任意變數、陣列元素、物件屬性 | 僅陣列 |
| 效能 | 語言結構,極快 | 函式呼叫,稍慢 |
| null 值處理 | 視為不存在 → false | 鍵存在 → true |
<?php
$arr = ['key1' => 'value', 'key2' => null, 'key3' => ''];
// key1:存在且非 null
var_dump(isset($arr['key1'])); // true
var_dump(array_key_exists('key1', $arr)); // true
// key2:存在但值為 null
var_dump(isset($arr['key2'])); // false ← 關鍵差異
var_dump(array_key_exists('key2', $arr)); // true
// key3:存在且為空字串
var_dump(isset($arr['key3'])); // true
var_dump(array_key_exists('key3', $arr)); // true
// key4:完全不存在
var_dump(isset($arr['key4'])); // false
var_dump(array_key_exists('key4', $arr)); // false
?>
isset($a, $b, $c)(全部符合才回 true)Nullable 型別邏輯null、false、0、'' 等 falsy 值function getArrayValue(array $arr, string $key, $default = null) {
return array_key_exists($key, $arr) ? $arr[$key] : $default;
}
class Demo {
public $prop = null;
}
$obj = new Demo();
isset($obj->prop); // false
property_exists($obj, 'prop'); // true ← 物件用 property_exists()
$arr = range(1, 10000);
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) isset($arr[5000]);
echo 'isset: ' . (microtime(true) - $start) . "s\n";
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) array_key_exists(5000, $arr);
echo 'array_key_exists: ' . (microtime(true) - $start) . "s\n";
// 典型結果:isset 約快 3-5 倍
isset() 是檢查「有沒有值」的高效工具;array_key_exists() 是檢查「有沒有這個鍵」的精確工具。根據業務語義選擇正確的函式,能避免隱性 Bug 並提升程式碼可讀性。