error_reporting(E_ALL);

// 要检查以下数组的健:
$test = [
    'f' => null,
    'fo' => '',
    'foo' => 'bar',
];

// 直接试图获取不存在的键会产生 "Undefined index" 错误
var_dump($test['f'] != ''); // false
var_dump($test['fo'] != ''); // false
var_dump($test['foo'] != ''); // true
var_dump($test['foobar'] != ''); // false, and a "Notice" error

// !empty() 与前者相同, 但不会触发错误
var_dump(!empty($test['f'])); // false
var_dump(!empty($test['fo'])); // false
var_dump(!empty($test['foo'])); // true
var_dump(!empty($test['foobar'])); // false

// isset() 在键未设置, 或键值为 null 时返回 false
var_dump(isset($test['f'])); // false
var_dump(isset($test['fo'])); // true
var_dump(isset($test['foo'])); // true
var_dump(isset($test['foobar'])); // false

// array_key_exists() 在键未设置时返回 false
var_dump(array_key_exists('f', $test)); // true
var_dump(array_key_exists('fo', $test)); // true
var_dump(array_key_exists('foo', $test)); // true
var_dump(array_key_exists('foobar', $test)); // false

empty()与直接获取键值比对的区别在于不触发 "Undefined index" 错误, 大多数情况建议替代后者. empty()涵盖条件最宽泛, true条件最严格.

isset()次之, 除null外, 对所有已设置的键返回true.

array_key_exists()则对任何已设置的键返回true, true条件最宽松.