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。