<?php
$structure = imap_fetchstructure($conn, $id, FT_UID);
if (array_key_exists('parts', $structure)) { // Warning: array_key_exists() expects parameter 2 to be array, boolean given
// ...
}
imap_fetchstructure 失敗時返回 false,非陣列,導致 array_key_exists 報警告。
| 方法 | 程式碼 | 優點 | 缺點 |
|---|---|---|---|
| 類型檢查 + array_key_exists | is_array($structure) && array_key_exists('parts', $structure) | 嚴謹,僅陣列才檢查鍵 | 稍長 |
| isset() | isset($structure['parts']) | 簡潔,自動處理非陣列/未設值 | 若值為 null 返回 false(通常可接受) |
| Nullsafe 運算子 (PHP 8+) | $structure?->parts ?? null | 現代語法,鏈式安全存取 | 需 PHP 8.0+ |
falsenull → falsenull → truenull → true(與 isset 不同)。if (is_array($data)) {
// 確定是陣列
if (array_key_exists($key, $data)) { ... } // 需區分 null 值
// 或
if (isset($data[$key])) { ... } // 一般情況
} else {
// 非陣列(false、null、物件、純量)
// 視業務邏輯處理
}
<?php
$response = json_decode($json, true);
if (isset($response['data']['items'])) {
foreach ($response['data']['items'] as $item) { ... }
}
// 任一層級不存在或為 null 直接跳過,無警告
<?php
$data = ['key' => null];
var_dump(isset($data['key'])); // bool(false)
var_dump(array_key_exists('key', $data)); // bool(true)
// 此時需用 array_key_exists 確認「鍵已設定但值為 null」
if (array_key_exists('key', $data)) {
// 鍵存在,處理 null 值邏輯
}
<?php
$obj = (object)['prop' => 'value'];
var_dump(isset($obj->prop)); // true
var_dump(property_exists($obj, 'prop')); // true (含不可見屬性)
// 動態屬性
var_dump(isset($obj->dynamic)); // false
isset()**:簡潔、安全、效能佳,涵蓋「變數存在且非 null」語意。array_key_exists()**,但**必須先確認是陣列**(is_array())。?-> Nullsafe 運算子**鏈式安全存取嵌套結構。array_key_exists,否則產生警告汙染日誌。