У меня есть метод «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(); } }