Intereting Posts
Запускать PHP-скрипт каждую секунду с использованием CLI Как я могу увеличить столбцы в mysql с помощью подготовленных операторов? MySQL: объединение запросов через несколько баз данных, расположенных на разных серверах Постоянное обновление текстовой игры PHP Простой HTML DOM Parser – отправлять переменные сообщения разница между orm и pdo Узнайте, как используется ширина изображения jQuery После отправки формы, когда в форме есть несколько вкладок, и на каждой вкладке есть вкладка таблицы (которая может добавить строку таблицы) http: // localhost / не работает в Windows 7. В чем проблема? Base64 кодирует загруженный файл, затем сохраняет в базе данных Есть ли способ ограничить количество представлений для php-формы? Как разрешить shell_exec действовать, как если команды выполняются внутри терминала Mac? Сессия Cookie vs Persistent Cookie Можете ли вы повторно использовать набор результатов mysql в PHP? Как проверить, изменился ли файл?

PHP: пустой не работает с методом getter

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