首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 字串陷阱:以方括號存取字元時鍵型別轉換導致 isset 誤判

     編輯:PHP 綜合知識

核心規則

字串以 [] 存取時,**索引會被強制轉為整數** (同陣列鍵轉換規則)。

陷阱實測

<?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 8.1+ 新函數:array_key_exists 別名

<?php
// PHP 8.1+ 可用
array_key_exists($key, $array); // 同舊函數
// 字串仍不適用
?>

結語

**字串不是關聯陣列**,不要用 isset($str[$key]) 檢查鍵是否存在。永遠先 is_array() 確認型別,再用 isset() 或 array_key_exists()。此陷阱常見於表單驗證、API 參數檢查,請列入 Code Review 清單。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved