In addition to Inspire's answer:
class Foo { public function __isset($name) { echo "public function __isset($name)\n"; return 'bar'===$name; } public function __get($name) { echo "public function __get($name)\n"; return 'bar'===$name ? 0 : NULL; } } $foo = new Foo; echo empty($foo->foo) ? ' empty' : ' not empty', "\n"; echo empty($foo->bar) ? ' empty' : ' not empty', "\n";
conclusion
public function __isset(foo) empty public function __isset(bar) public function __get(bar) empty
The value for the first property (foo) empty () is only called by __isset (), which returns false empty($foo->foo)===true
For the second property (bar), __isset () was called and it is correct. Then the property is selected through __get () and interpreted as a boolean (see http://docs.php.net/language.types.type-juggling ). And since (bool) 0 is false , empty () also returns true for empty($foo->bar)
source share