PHP isset 和 empty 区别

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

先搞懂两个函数的“工作对象”

这两个函数都是用来检查变量的,但就像你检查一个抽屉有没有东西,和检查抽屉里有没有“能用的东西”,是完全不同的逻辑。

PHP isset 和 empty 区别

举个例子,你找妈妈要零花钱,妈妈的抽屉里:

  • 要是这个抽屉本身就不存在,比如妈妈压根没准备零花钱的抽屉,那你肯定拿不到钱;
  • 要是抽屉在,但里面是空的,连一分钱都没有,你也拿不到钱。

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。下次再碰到要判断变量的场景,先想清楚你要的是“存在”还是“有值”,就不会再用错了。

上一篇 Java 如何选择 JDK 版本