用户中心改手机号,表单里传了0作为区号,后端用empty判空,直接提示参数缺失。查了半天才发现empty(0)是true。PHP的empty名字叫空,判定范围却比想象宽得多。

哪些值会被判成空

官方列了七种:空字符串、整数0、浮点0.0、字符串0、null、false、空数组。另外未定义变量传给empty不会报Notice,这是它能安全探测变量的原因。除此之外全为false,包括只有一个空格的字符串、字符串0.0、空对象。

empty与isset的边界

  • isset:变量存在且不为null才true,0和空字符串都算存在。
  • empty:isset为false时一定为true,另外0、空字符串、空数组也算空。
  • is_null:只判null,未定义变量会报警告。

所以接收参数时,判断有没有传,用isset($_POST['mobile']);判断内容是否有效,再单独校验长度和格式。

0值和字符串0的坑

金额、数量、开关状态都可能合法地为0。这类字段不要用empty,写isset加全等比较空字符串更准确。字符串0同样被判空,用户输入编号0会被拦下来。

版本差异与写法建议

PHP 5.5之后empty支持任意表达式,empty($arr['k'])和empty(foo())都能用,之前的版本会解析错误。想同时判存在和空,empty一步到位,但语义要写注释说明,否则后面的人改字段类型时容易出事。

一句话原则:数字型字段永远别用empty兜底。宁可多写一个isset加严格比较,也别让0变成缺失参数。