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