Thursday, August 19, 2010

PHP: Магические методы, передача по ссылке и empty

Если объект возвращает магическое __get по ссылке (&__get()), то помните, что функции empty и isset будут возвращать false (им нужно значение, а не ссылка). Чтобы обойти это, объявите в объекте магическое __isset.



abstract class MyObject
{
 protected $s=array();

 public function &__get($key)
 {
  if (isset($this->s[$key])) return $this->s[$key];
  return NULL;
 }

 public function __isset($key)
 {
  if (isset($this->s[$key])) return true;
  else return false;
 }
 
 public function __unset($key)
 {
  unset($this->s[$key]);
 }
 
 public function __set($key,$value)
 {
  $this->s[$key]=$value;
 }

}

А если Вы используете ещё и интерфейс ArrayAccess в этом объекте, то задумайтесь о том, что ArrayAccess не умеет возвращать значение по ссылке и по-хорошему нужно убрать этот интерфейс из объекта, который использует &__get(). Хотя, это не критично, но может создать ситуацию, когда код будет работать не так, как ожидается. Если кода уже написано очень много и он в продакшене - лучше оставить как есть. Но при проектировании нужно обязательно убрать интерфейс ArrayAccess из класса с &__get().

1 comment:

  1. I every time emailed this blog post page to all my friends, since if like
    to read it then my contacts will too.

    My webpage ... The Diet Solution Program Scam

    ReplyDelete