zoco

empty的一个bug

2015-08-31


先看一段代码例子:

class  x {
    public function __get($k) {
        return 1;
    }

    public function __isset($k) {
        return true;
    }
}

$x = new x();
var_dump($x->b);
var_dump(empty($x->b));

这个返回 1 false

把__isset的代码注释掉,例子为:

class  x {
    public function __get($k) {
        return 1;
    }

    //public function __isset($k) {
    //    return true;
    //}
}

$x = new x();
var_dump($x->b);
var_dump(empty($x->b));

返回变为 1 true

原因为:

empty() will call __isset() first, and only if it returns true will it call __get().

Implement __isset() and make it return true for every magic property that you support.

也就是empty在__isset存在并且返回true 的时候才会调用__get。