字串以 [] 存取時,**索引會被強制轉為整數** (同陣列鍵轉換規則)。
<?php
$str = '123456';
echo $str['php']; // '1' (索引 'php' → int 0)
var_dump(isset($str['php'])); // bool(true) ❌ 預期 false
// 因為 'php' → (int)0 → $str[0] 存在 → isset 回傳 true
?>
<?php
function issetStringKey($var, $key)
{
// 先確認是陣列,再檢查鍵
return is_array($var) && isset($var[$key]);
}
// 使用
$arr = ['php' => 'value'];
$str = 'string';
var_dump(issetStringKey($arr, 'php')); // true
var_dump(issetStringKey($str, 'php')); // false ✅
?>
<?php
function keyExists($var, $key)
{
if (is_array($var)) {
return array_key_exists($key, $var); // 包含 null 值鍵
}
if (is_string($var)) {
// 字串無「鍵」概念,僅有索引
return is_int($key) && $key >= 0 && $key < strlen($var);
}
return false; // 物件用 property_exists / isset($obj->prop)
}
?>
<?php
// PHP 8.1+ 可用
array_key_exists($key, $array); // 同舊函數
// 字串仍不適用
?>
**字串不是關聯陣列**,不要用 isset($str[$key]) 檢查鍵是否存在。永遠先 is_array() 確認型別,再用 isset() 或 array_key_exists()。此陷阱常見於表單驗證、API 參數檢查,請列入 Code Review 清單。