class a {
function __get($property){...}
}
$obj = new a();
var_dump(isset($obj->newproperty));
Wydaje się, że odpowiedź jest nie, ale dlaczego?Czy isset() spowoduje uruchomienie __get i dlaczego?
class a {
function __get($property){...}
}
$obj = new a();
var_dump(isset($obj->newproperty));
Wydaje się, że odpowiedź jest nie, ale dlaczego?Czy isset() spowoduje uruchomienie __get i dlaczego?
Ponieważ sprawdza on __isset zamiast pobierać go za pomocą __get.
Jest znacznie lepszą opcją wywołania __isset, ponieważ nie ma standardu na puste. Być może w kontekście klasy zerowej wartość jest akceptowalna. Możesz także mieć klasę, która gdyby członek nie istniał, zwróciłby nowy pusty obiekt, który złamałby isset($myObj->item)
, ponieważ w takim przypadku zawsze zwracałby wartość true.
Magiczna funkcja __get jest wywoływana tylko podczas próby uzyskania dostępu do właściwości, która nie istnieje. Sprawdzenie, czy właściwość istnieje, nie jest tym samym, co jej pobranie.
Nie, __get
nie należy uruchamiać, gdy próbujesz ustalić, czy właściwość jest ustawiona: testowanie, czy właściwość jest ustawiona, to nie to samo, co próba uzyskania jej wartości.
Korzystanie z isset
wyzwala metodę magiczną __isset
.
Patrz:
To po prostu nie jest; zamiast tego możesz użyć __isset. Jest to określone jako 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")
Wydaje się, że nie zdefiniowałem __isset w moim przykładzie? – ORM
Wygląda na to, że tak się nie stało, ale jeśli już to zdefiniowałeś, powinien był zostać wywołany; i definiowanie go lub nie zmienia nic o tym, że '__get' nie jest wywoływany podczas testowania, jeśli właściwość jest ustawiona. –