isset()检查变量是否已声明且不为null;empty()检查已定义变量是否为空值(如''、0、false等),未定义会触发Notice;判断数组键存在用array_key_exists(),对象属性存在用property_exists(),常量/函数/类存在分别用defined()/function_exists()/class_exists()。

isset() 和 empty() 的核心区别在哪
判断“某个值是否存在”,PHP 里最常混淆的是 isset() 和 empty()。它们根本不是一回事:isset() 检查变量是否已声明且不为 null;empty() 检查变量是否“空”(比如 ''、0、false、null、[] 等),但它**要求变量必须已定义**,否则会触发 Notice: Undefined variable。
所以,如果你只关心“这个变量有没有被设置过”,就用 isset();如果关心“它有没有值且值是否有效”,再考虑 empty() 或更精确的判断。
判断数组键是否存在:用 array_key_exists() 而不是 isset()
isset($arr['key']) 看起来能用,但有个致命陷阱:当 $arr['key'] === null 时,isset() 返回 false,但它其实存在——只是值是 null。这时候你真正要问的是“键在不在数组里”,不是“键对应的值是不是非 null”。
-
array_key_exists('key', $arr)—— 正确:只看键是否存在,不管值是什么 -
isset($arr['key'])—— 错误场景:值为null时误判为“不存在” -
key_exists()是别名,但不推荐,因为不是所有 PHP 版本都保证兼容
判断对象属性是否存在:property_exists() vs isset()
对对象来说,isset($obj->prop) 同样受访问控制和魔术方法影响。如果属性是 private 或 protected,且没定义 __isset(),isset() 可能返回 false 即使属性真实存在;如果定义了 __isset(),结果又取决于它的逻辑。
立即学习“PHP免费学习笔记(深入)”;
想绕过访问控制、纯粹确认属性是否被声明,用 property_exists($obj, 'prop'):
- 它无视访问修饰符(
public/private/protected) - 它不调用
__isset(),只查类结构定义 - 注意:它不检查实例是否实际设置了该属性值(比如动态赋值的
$obj->prop = ...在未声明时仍返回false)
判断常量、函数、类是否存在:用 defined()、function_exists()、class_exists()
这些是独立于变量作用域的元信息查询,不能用 isset():
- 常量是否存在 →
defined('MY_CONST') - 函数是否存在(含用户自定义和内置)→
function_exists('json_encode') - 类是否存在(支持自动加载)→
class_exists('DateTime'),加第二个参数false可跳过 autoload - 接口、Trait 类似,用
interface_exists()、trait_exists()
漏掉这些,硬套 isset() 会直接报错或返回 false,而且毫无提示。



















