Будет ли isset () запускать __get и почему?

class a { function __get($property){...} } $obj = new a(); var_dump(isset($obj->newproperty)); 

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

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

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

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

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

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

Видеть :

  • isset
  • и перегрузка

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

 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")