php empty 函数判断结果为空但实际值却为非空的原因解析


Posted in PHP onMay 28, 2018

最近我在一个项目中使用 empty 时获取到了一些意料之外的结果。下面是我处理后的调试记录,在这里与你分享了。

var_dump(
  $person->firstName,
  empty($person->firstName)
);

它的结果是:

string(5) "Freek"
bool(true)

结果出人意料。为什么变量的值为字符串,但同时会是空值呢?让我们在 $person->firstName 变量上尝试使用其它一些函数来进行判断吧:

var_dump(
  $person->firstName,
  empty($person->firstName),
  isset($person->firstName),
  is_null($person->firstName)
);

以上结果为:

string(5) "Freek"
bool(true) // empty
bool(true) // isset
bool(false) // is_null

译者注:这边的结果可能存在问题 isset 的结果同样为 false,可以到 这里 去运行下查看结果。

isset 和 is_null 函数执行结果符合预期判断,唯独 empty 函数返回了错误结果。

这里让我们来看看 person 类的实现代码吧:

class person
{  protected $attributes = [];
  public function __construct(array $attributes)
  {
    $this->attributes = $attributes;
  }
  public function __get($name)
  {
    return $this->attributes[$name] ?? null;
  }
}

从上述代码我们可以看到 Person 对象的成员变量是通过 __get 魔术方法从 $attributes 数组中检索出来的。

当将变量传入一个普通函数时,$person->firstName 会先进行取值处理,然后再将获取到的结果作为参数传入函数内。

但是 empty 不是一个函数,而是一种数据结构。所以当将 $person->firstName** 传入 **empty** 时,并不会先进行取值处理。而是会先判断 **$person 对象成员变量 firstName 的内容,由于这个变量并未真实存在,所以返回 false。

在正中应用场景下,如果你希望 empty 函数能够正常处理变量,我们需要在类中实现 __isset 魔术方法。

class Person
{
  protected $attributes = [];
  public function __construct(array $attributes)
  {
    $this->attributes = $attributes;
  }
  public function __get($name)
  {
    return $this->attributes[$name] ?? null;
  }
  public function __isset($name)
  {
    $attribute = $this->$name;
    return !empty($attribute);
  }
}

这是当 empty 进行控制判断时,会使用这个魔术方法来判断最终的结果。

再让我们看看输出结果:

var_dump(
  $person->firstName, 
  empty($person->firstName)
);

新的检测结果:

string(5) "Freek"
bool(false)

总结

以上所述是小编给大家介绍的php empty 函数判断结果为空但实际值却为非空的原因解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
php Ajax乱码
Apr 09 PHP
php array_slice函数的使用以及参数详解
Aug 30 PHP
php 表单数据的获取代码
Mar 10 PHP
php 数学运算验证码实现代码
Oct 11 PHP
PHP--用万网的接口实现域名查询功能
Dec 13 PHP
解析php中反射的应用
Jun 18 PHP
PHP封装分页函数实现文本分页和数字分页
Oct 23 PHP
PHP向socket服务器收发数据的方法
Jan 24 PHP
Symfony生成二维码的方法
Feb 04 PHP
Thinkphp单字母函数使用指南
May 08 PHP
PHP数组相加操作及与array_merge的区别浅析
Nov 26 PHP
在php的yii2框架中整合hbase库的方法
Sep 20 PHP
PHP排序二叉树基本功能实现方法示例
May 26 #PHP
Thinkphp5+uploadify实现的文件上传功能示例
May 26 #PHP
PHP ADODB实现事务处理功能示例
May 25 #PHP
PHP ADODB实现分页功能简单示例
May 25 #PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
May 25 #PHP
php7函数,声明,返回值等新特性介绍
May 25 #PHP
php框架CodeIgniter主从数据库配置方法分析
May 25 #PHP
You might like
PHP中的cookie
2006/11/26 PHP
php2html php生成静态页函数
2008/12/08 PHP
php 数组的合并、拆分、区别取值函数集
2010/02/15 PHP
win2003服务器使用WPS的COM组件的一些问题解决方法
2012/01/11 PHP
PHP添加Xdebug扩展的方法
2014/02/12 PHP
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
jQuery 使用手册(三)
2009/09/23 Javascript
Javascript 实用小技巧
2010/04/07 Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
2013/04/08 Javascript
js使用心得分享
2015/01/13 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
AngularJs expression详解及简单示例
2016/09/01 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
node.js获取参数的常用方法(总结)
2017/05/29 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
Python内置加密模块用法解析
2019/11/25 Python
基于python模拟TCP3次握手连接及发送数据
2020/11/06 Python
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
工程力学专业毕业生求职信
2013/10/06 职场文书
动物学专业毕业生求职信
2013/10/11 职场文书
《学会合作》教学反思
2014/04/12 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
幼儿发展评估方案
2014/06/11 职场文书
奥林匹克的口号
2014/06/13 职场文书
爱心捐款感谢信
2015/01/20 职场文书
员工手册编写范本
2015/05/14 职场文书
八年级英语教学反思
2016/02/15 职场文书
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python
python数字图像处理实现图像的形变与缩放
2022/06/28 Python