​PHP开发过程的那些坑(五) ——PHP的empty()

时间:2022-05-03
本文章向大家介绍​PHP开发过程的那些坑(五) ——PHP的empty(),主要内容包括相关阅读:、PHP开发过程的那些坑(四) ——PDO bindParam函数、PHP开发过程的那些坑(三) ——PHParray_shift函数、PHP开发过程的那些坑(二) ——PHP empty函数、PHP开发过程的那些坑(一) ——对象拷贝、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

PHP开发过程的那些坑(五)——PHP的empty()

(原创内容,转载请注明来源,谢谢)

一、遇到的问题

PHP的empty不是一个函数,而是一个语言结构,用其可以判断大多数的变量是否为空。但是,在判断private的属性(已经用魔术方法__get()保证可以获取到)的时候,会发生奇怪的事情。

现象实例:

class Object{
private $prop;
public function __construct(){
$this->prop = ‘a’;
}
public function __get($prop){
return $this->$prop;
}
}
$obj = new Object();
var_dump($obj->prop);// a
var_dump(empty($obj->prop));//true,不正常现象
var_dump(‘’ == $obj->prop);//false

二、问题分析

经过查阅资料,采用empty判断对象的private的属性是否为空的时候,会调用的是对象对应的类的魔术方法__isset(),即判断这个属性是否存在,而不是去判断属性的值了。

这样就可以解释,为什么实际属性值非空,而empty判断是true。

三、解决方案

1、采用==判断是否为空。

2、$prop = $obj->prop; empty($prop);

3、将对象的private设置成public。

第三种得根据业务场景,不一定都可以用public;第二种和第一种比较通用,个人建议对于判断类的属性值的问题,都统一用第一种,这样可以避免很多不必要的坑。

——written by linhxx 2017.09.14

相关阅读:

PHP开发过程的那些坑(四) ——PDO bindParam函数

PHP开发过程的那些坑(三) ——PHParray_shift函数

PHP开发过程的那些坑(二) ——PHP empty函数

PHP开发过程的那些坑(一) ——对象拷贝