class a {
function __get($property){...}
}
$obj = new a();
var_dump(isset($obj->newproperty));
Кажется, что ответ не определен, но почему?Будет ли isset() запускать __get и почему?
class a {
function __get($property){...}
}
$obj = new a();
var_dump(isset($obj->newproperty));
Кажется, что ответ не определен, но почему?Будет ли isset() запускать __get и почему?
Потому что он проверяет __isset, а не извлекает его с помощью __get.
Это гораздо лучший вариант для вызова __isset, так как нет стандарта на то, что пусто. Возможно, в контексте класса null допустимое значение. Вы также можете иметь класс, который, если член не существовал, он возвратил новый пустой объект, который сломал бы isset($myObj->item)
, так как в этом случае он всегда возвращал true.
Волшебная функция __get вызывается только при попытке доступа к объекту, который не существует. Проверка наличия свойства - это не то же самое, что и его получение.
Нет, __get
не следует запускать, когда вы пытаетесь определить, установлено ли свойство: тестирование, если свойство установлено, - это не то же самое, что пытаться получить его значение.
Использование isset
запускает метод магии __isset
.
См:
Это просто не; Вместо этого вы можете использовать __isset. Это выложено here.
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")
Похоже, что я не определил __isset в моем примере? – ORM
Кажется, вы этого не сделали, но, если бы вы определили его, его следовало бы назвать ;; и определение этого или нет ничего не меняет о '__get', который не вызывается, когда вы проверяете, установлено ли свойство. –