Как дополнение к ответу Inspire:
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";
вывод
public function __isset(foo)
empty
public function __isset(bar)
public function __get(bar)
empty
значение для первого свойства (foo) empty () вызвал только __isset (), который вернул false -> empty($foo->foo)===true
Для второго свойства (bar) было вызвано __isset (), и оно вернул true. Затем свойство выбирается с помощью __get () и интерпретируется как логическое значение (см. http://docs.php.net/language.types.type-juggling).. А поскольку (bool) 0 равно false
, empty () также возвращает true
для empty($foo->bar)