У меня есть метод «getter», например
function getStuff($stuff){ return 'something'; } 
  если я проверил его с empty($this->stuff) , я всегда получаю FALSE , но я знаю, что $this->stuff возвращает данные, потому что он работает с echo. 
  и если я проверю его с помощью !isset($this->stuff) я получаю правильное значение, и условие никогда не выполняется … 
вот тестовый код:
 class FooBase{ public function __get($name){ $getter = 'get'.ucfirst($name); if(method_exists($this, $getter)) return $this->$getter(); throw new Exception("Property {$getter} is not defined."); } } class Foo extends FooBase{ private $my_stuff; public function getStuff(){ if(!$this->my_stuff) $this->my_stuff = 'whatever'; return $this->my_stuff; } } $foo = new Foo(); echo $foo->stuff; if(empty($foo->stuff)) echo 'but its not empty:('; if($foo->stuff) echo 'see?'; 
         empty() __isset() вызовет __isset() , и только если он вернет true , он вызовет __get() . 
  __isset() и верните true для каждого свойства магии, которое вы поддерживаете. 
 function __isset($name) { $getter = 'get' . ucfirst($name); return method_exists($this, $getter); } 
  Волшебные геттеры не вызывается при проверке с empty .  Значение действительно не существует, поэтому empty возвращает true .  Вам необходимо будет реализовать __isset чтобы сделать эту работу правильно. 
__isset()запускается вызовомisset()илиempty()для недоступных свойств.http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members
  Метод получения магии PHP называется __get() .  $this->stuff не будет называть getStuff() .  Попробуй это: 
 public function __get($property) { if ($property == 'stuff') { return $this->getStuff(); } }