Я пытаюсь сделать такие функции, как empty()
и isset()
с данными, возвращаемыми методами.
Что я до сих пор:
abstract class FooBase{ public function __isset($name){ $getter = 'get'.ucfirst($name); if(method_exists($this, $getter)) return isset($this->$getter()); // not working :( // Fatal error: Can't use method return value in write context } public function __get($name){ $getter = 'get'.ucfirst($name); if(method_exists($this, $getter)) return $this->$getter(); } public function __set($name, $value){ $setter = 'set'.ucfirst($name); if(method_exists($this, $setter)) return $this->$setter($value); } public function __call($name, $arguments){ $caller = 'call'.ucfirst($name); if(method_exists($this, $caller)) return $this->$caller($arguments); } }
Использование:
class Foo extends FooBase{ private $my_stuff; public function getStuff(){ return $this->my_stuff; } public function setStuff($stuff){ $this->my_stuff = $stuff; } } $foo = new Foo(); if(empty($foo->stuff)) echo "empty() works! \n"; else "empty() doesn't work:( \n"; $foo->stuff = 'something'; if(empty($foo->stuff)) echo "empty() doesn't work:( \n"; else "empty() works! \n";
http://codepad.org/QuPNLYXP
Как я могу сделать его таким пустым / isset return true / false, если:
my_stuff
выше не установлен или имеет пустое или нулевое значение в случае empty()
?
public function __isset($name){ $getter = 'get'.ucfirst($name); return method_exists($this, $getter) && !is_null($this->$getter()); }
Это проверяет, существует или нет $getter()
(если он не существует, предполагается, что свойство также не существует) и возвращает ненулевое значение. Поэтому NULL
заставит его возвращать false, как и следовало ожидать после чтения руководства php для isset()
.
Еще немного вариантов не зависит от геттера
public function __isset($name) { $getter = 'get' . ucfirst($name); if (method_exists($this, $getter)) { return !is_null($this->$getter()); } else { return isset($this->$name); } }
Ваш код возвращает ошибку из-за этих строк:
if(method_exists($this, $getter)) return isset($this->$getter());
Вы можете просто заменить его:
if (!method_exists($this), $getter) { return false; // method does not exist, assume no property } $getter_result = $this->$getter(); return isset($getter_result);
и он вернет false, если геттер не определен или он возвращает NULL
. Я предлагаю вам лучше подумать о том, как вы определяете какое-либо свойство, установленное или нет.
Вышеприведенный код также предполагает, что вы создаете геттеры для всех своих свойств, поэтому, когда нет геттера, свойство считается не установленным .
Кроме того, почему вы используете геттеры? Похоже, они здесь немного переполнены.