isset判断变量是否存在且不为null,empty判断变量是否“空”(未定义或值为""、0、"0"、null、false、[]等);二者用途不同,需据验证目标选择。

isset 和 empty 都是用来判断变量状态的函数,但它们检查的目标完全不同:一个是看“有没有”,一个是看“有没有意义”。选错容易导致逻辑漏洞,比如把合法的 0 当成空,或把空字符串当成已提交。
isset 看的是“变量是否存在且不为 null”
它只关心两件事:变量是否被声明过、值是不是明确设为 null。其他所有值——包括 0、"0"、""(空字符串)、false、[](空数组)——只要变量存在且没被设为 null,isset 就返回 true。
-
$_GET['page'] 没传时,
isset($_GET['page'])是 false;传了?page=0,结果是 true -
$a = "",
isset($a)是 true;但 $a = null 或 unset($a),结果就是 false - 常用于防止“未定义变量”警告,比如访问
$_POST['email']前先用 isset 判断
empty 看的是“变量是否算‘空’”
它更宽泛,把“不存在”和“存在但无实际内容”都归为“空”。只要变量未定义,或者值属于以下任意一种:""、0、0.0、"0"、null、false、[],empty 就返回 true。
-
empty($_POST['age'])对age=0和age=(空)都返回 true —— 这在年龄/数量类字段中可能误判 -
empty($user['name'])对$user['name'] = ""、$user['name'] = 0、甚至$user根本没定义,都会返回 true - 适合快速过滤明显无效输入,比如昵称、留言内容这类“非空即有效”的字段
怎么选:先想清楚你要验证什么
关键不是哪个“更好”,而是你当前要解决的问题属于哪一类:
立即学习“PHP免费学习笔记(深入)”;
- 要确认参数是否传过来了(防 Notice)→ 用 isset
- 要确认用户是否真填了有意义的内容 → 通常用 !empty(),但得留意 0 和 "0" 是否算合法值
- 如果字段允许 0(如数量、评分),就不能单靠 empty;可组合判断:
isset($val) && $val !== ''或isset($val) && trim($val) !== '' - 对数组元素是否存在,isset($arr['key']) 比 array_key_exists() 更快,也比 empty($arr['key']) 更精准(避免把 0 当空)
一个典型表单场景对比
假设处理 $_POST['price']:
-
isset($_POST['price']):只告诉你用户有没有提交 price 字段(哪怕值是 "" 或 "0") -
!empty($_POST['price']):告诉你 price 不仅提交了,而且不是 ""、0、"0"、null 等——但如果价格真为 0 元,这个判断会失败 - 更稳妥写法:
isset($_POST['price']) && is_numeric($_POST['price']) && $_POST['price'] >= 0



















