2010-02-21 2 views

ответ

19

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

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

0

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

1

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

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

См:

+0

Похоже, что я не определил __isset в моем примере? – ORM

+0

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

2

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

0
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") 
Смежные вопросы