isset、empty 误区

isset()  常用来判定变量是否存在  但是当变量赋值为NUll时候,返回值一样是FALSE  而实际上变量是存在的,与实际情况不符,判定错误。

  empty() 用来判定变量或者类的属性值是否为等价为空的数据,但是如下类:

 1 class Person
 2 {
 3     protected $attributes = [];
 4 
 5     public function __construct(array $attributes)
 6     {
 7         $this->attributes = $attributes;
 8     }
 9 
10     public function __get($name)
11     {
12         return $this->attributes[$name] ?? null;
13     }
14 
15     public function __isset($name)
16     {
17         $attribute = $this->$name;
18 
19         return !empty($attribute);
20     }
21 }
  var_dump( $person->firstName, empty($person->firstName) );

当方法  __isset()不存在时   empty($person->firstName)输出为false 但是添加__isset()方法后  它的返回结果为false

  出现此情况原因:

  Person对象的成员变量是通过 __get 魔术方法从 $attributes 数组中检索出来的。当将变量传入一个普通函数时,$person->firstName 会先进行取值处理,然后再将获取到的结果作为参数传入函数内。但是 empty 不是一个函数,而是一种数据结构。所以当将 $person->firstName 传入 empty 时,并不会先进行取值处理。而是会先判断 $person 对象成员变量 firstName 的内容,由于这个变量并未真实存在,所以返回 false。

发表回复

京ICP备15027918号-1