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