Intereting Posts

Как реализовать математический метод __isset () в PHP?

Я пытаюсь сделать такие функции, как 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()
  • метод не существует (не уверен, что neeed, потому что я думаю, что вы все равно получаете фатальную ошибку)

?

 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 . Я предлагаю вам лучше подумать о том, как вы определяете какое-либо свойство, установленное или нет.

Вышеприведенный код также предполагает, что вы создаете геттеры для всех своих свойств, поэтому, когда нет геттера, свойство считается не установленным .

Кроме того, почему вы используете геттеры? Похоже, они здесь немного переполнены.