Будет ли isset () вызывать __get и почему? - PullRequest
8 голосов
/ 21 февраля 2010
class a {
   function __get($property){...}
}

$obj = new a();
var_dump(isset($obj->newproperty));

Кажется, ответ нет, но почему?

Ответы [ 5 ]

19 голосов
/ 21 февраля 2010

Поскольку он проверяет __ isset , а не извлекает его с помощью __get.

Гораздо лучше выбрать __isset, так как не существует стандарта на то, что пусто. Может быть, в контексте класса null является приемлемым значением. Вы также можете иметь класс, который, если элемент не существует, возвращает новый пустой объект, который будет ломать isset($myObj->item), поскольку в этом случае он всегда будет возвращать true.

2 голосов
/ 21 февраля 2010

Это просто не так; вместо этого вы можете использовать __isset. Это выложено здесь .

1 голос
/ 21 февраля 2010

Нет, __get не должен запускаться, когда вы пытаетесь определить, установлено ли свойство: проверка, установлено ли свойство, не то же самое, что попытка получить его значение.

Использование isset запускает магический метод __isset.

См .:

0 голосов
/ 23 февраля 2013
Class A{
   public function __get($key){
      ...
   }
   public function __set($key,$name){
      ...
   }
   public function __unset($key){
      ...
   }
   public function __isset($key){
      ...
   }
}
$obj = new A();
$get = $obj->newproperty;//$obj->__get("newproperty")
$obj->newproperty = "X";//$obj->__set("newproperty","X")
$bool = isset($obj->newproperty);//$obj->__isset("newproperty")
unset($obj->newproperty);//$obj->__unset("newproperty")
0 голосов
/ 21 февраля 2010

Магическая функция __get вызывается только при попытке доступа к несуществующему свойству. Проверка существования свойства - это не то же самое, что получение его.

...