PHP isset 和 empty 区别
在日常写代码的时候,很多新手朋友都会被PHP里的isset和empty搞混,明明都是用来判断变量的,结果用错了就会出现各种奇怪的bug,比如明明变量有值,程序却提示“不存在”,或者本该显示内容的地方一片空白。今天就用大家生活里都能碰到的例子,把这两个函数讲明白,看完就能直接用。
先搞懂两个函数的“工作对象”
这两个函数都是用来检查变量的,但就像你检查一个抽屉有没有东西,和检查抽屉里有没有“能用的东西”,是完全不同的逻辑。

举个例子,你找妈妈要零花钱,妈妈的抽屉里:
- 要是这个抽屉本身就不存在,比如妈妈压根没准备零花钱的抽屉,那你肯定拿不到钱;
- 要是抽屉在,但里面是空的,连一分钱都没有,你也拿不到钱。
isset就相当于“检查抽屉存不存在”,而empty是“检查抽屉里有没有能用的钱”,这就是最核心的区别。
用具体场景对比两个函数的用法
咱们用几个实际的代码场景,把这两个函数的差异说透,保证你下次不会用混。
场景1:检查用户输入的昵称
很多网站注册的时候,会要求用户填昵称,要是没填就提示“昵称不能为空”。这时候empty就比isset好用。
比如用户提交表单后,昵称变量$nickname的情况:
- 要是用户没填,
$nickname的值是空字符串""; - 要是用户填了,
$nickname就是类似“小明”的字符串; - 要是这个变量压根不存在(比如提交的表单字段写错了),
$nickname就不存在。
这时候用empty($nickname),只要变量不存在、是空字符串、是0、是null这些“没用的值”,都会返回true,正好能判断用户有没有好好填昵称,而用isset($nickname)的话,只要变量存在,哪怕是空字符串,也会返回true,就会出现“明明没填昵称,程序却以为填了”的bug。
场景2:检查用户的收货地址
假设你做一个收货地址的设置页,需要判断用户有没有添加过地址,这时候就得用isset了。
比如用户的地址存在变量$address里,情况:
- 要是用户从没设置过地址,
$address这个变量根本没创建; - 要是用户设置过,但后来删掉了,有的程序会把
$address设为null; - 要是用户设置了地址,
$address就是“北京市朝阳区XX路”这类字符串。
这时候用isset($address),只要变量存在且不是null,就会返回true,正好能判断用户有没有添加过地址;要是用empty的话,哪怕用户设置了地址,但不小心写成了0或者空字符串,就会被误判成“没设置地址”,结果就是本该显示的地址页变成了空白。
新手最容易踩的几个坑
哪怕懂了核心区别,实际用的时候还是会踩小坑,这几个一定要记牢:
第一,isset只能检查变量,不能检查字符串或者数组的某个元素,比如isset("hello")是没用的,而empty也一样。
第二,0这个值很特殊,比如判断用户的年龄,要是用户年龄是0(比如刚生下来的宝宝),empty($age)会返回true,因为0在PHP里会被当成“空值”,这时候就不能用empty,得用isset或者is_null来判断。
第三,isset判断变量存在的前提是,这个变量没有被unset(手动删除)过,要是你用unset删掉了变量,isset就会直接返回false。
其实总结起来很简单:要判断“有没有这个东西”用isset,要判断“这个东西有没有用(有没有值)”用empty。下次再碰到要判断变量的场景,先想清楚你要的是“存在”还是“有值”,就不会再用错了。