isset()判断变量是否已声明且不为null,empty()判断值在业务上是否“算空”但范围过宽;二者适用场景不同,需据业务逻辑谨慎选择。

isset() 判断变量“有没有”,不是判断“空不空”
它只关心两件事:变量是否已声明、值是否不为 null。哪怕值是 0、"0"、false、[],只要变量存在且没被设成 null,isset() 就返回 true。
常见错误现象:if (!isset($_POST['price'])) 本意是“价格没传”,但若用户填了 0(免费商品),这个条件不会触发——因为 isset($_POST['price']) 仍是 true。
- 适合场景:检查表单字段是否提交(哪怕值为空字符串)、访问数组键前防报错、配合
??运算符提供默认值 - 不能用于表达式:
isset($a + $b)直接报错,只接受变量本身 - 性能略高:它是语言结构,不是函数,无函数调用开销
empty() 判断值在业务上“算不算空”,但范围太宽
empty() 的逻辑是:!$var 的安全版——它把 0、"0"、false、null、""、[] 和未定义变量全当成“空”。它不区分“没传”和“传了零”。
典型陷阱:$_GET['id'] = '0' 时,!empty($_GET['id']) 为 false,整个分支跳过,但 0 是合法 ID;$age = 0 时,empty($age) 返回 true,新生儿被当成“未填写年龄”。
- PHP 5.5+ 支持表达式,但极少有用例,反而增加歧义
- 对未定义变量不报 warning,这点比直接写
!$var安全 - 空格字符串
" "是个特例:isset(" ") === true,empty(" ") === false,但它业务上往往该当“空”处理
数组键是否存在,必须用 isset(),别信 empty()
检查 $arr['key'] 是否被设置,只能靠 isset($arr['key'])。因为 empty($arr['key']) 在两种完全不同的情况下都返回 true:一是键根本不存在,二是键存在但值恰好是 0 或 false 或 null——你无法反推原因。
例如:$user = ['name' => ''];,empty($user['name']) 是 true,但你不知道这是 $user['name'] 没定义,还是定义了却等于空字符串。
- 正确姿势:
isset($arr['key']) && $arr['key'] !== ''或array_key_exists('key', $arr)(后者能区分null值) - 如果只是想判非空字符串,优先用
isset($val) && trim($val) !== '',比!empty($val)更可控
真实项目里怎么选:先问自己两个问题
第一问:我要确认的是“这个变量/键有没有被传过来”,还是“这个值在业务上有没有意义”?前者用 isset(),后者得自己定义规则,别直接套 empty()。
第二问:这个值是否可能为 0、"0"、false 等“假值”但仍合法?如果是,empty() 就不该出现。
- 表单必填字段校验:
isset($_POST['email']) && trim($_POST['email']) !== '' - 带默认值的参数获取:
$limit = $_GET['limit'] ?? 10;,再单独校验是否为正整数 - 兼容老代码时注意:
empty()在 PHP 5.5+ 虽支持表达式,但isset()依然不能动态调用——$func = 'isset'; $func($var)必报错
最常被忽略的一点:所有函数都不处理首尾空白。业务上认为“只填空格=没填”,就必须显式加 trim(),没人替你做这件事。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











