Как реализовать математический метод __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, потому что я думаю, что вы все равно получаете фатальную ошибку)
?
Ответы
Ответ 1
public function __isset($name){
$getter = 'get'.ucfirst($name);
return method_exists($this, $getter) && !is_null($this->$getter());
}
Проверяет, существует или нет $getter()
(если он не существует, он предположил, что это свойство также не существует) и возвращает ненулевое значение. Поэтому NULL
приведет к возврату false, как и следовало ожидать после чтения руководства по php для isset()
.
Ответ 2
Немного больше не зависит от getter
public function __isset($name)
{
$getter = 'get' . ucfirst($name);
if (method_exists($this, $getter)) {
return !is_null($this->$getter());
} else {
return isset($this->$name);
}
}
Ответ 3
Ваш код возвращает ошибку из-за этих строк:
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
. Я предлагаю вам лучше подумать о том, как вы определили какое-либо свойство, установленное или нет.
В приведенном выше коде также предполагается, что вы создаете геттеры для всех своих свойств, таким образом , когда нет геттера, свойство считается не установленным.
Кроме того, почему вы используете геттеры? Они, кажется, здесь немного перегружены.