2010-02-21 14 views

Odpowiedz

19

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.

0

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.

1

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:

+0

Wydaje się, że nie zdefiniowałem __isset w moim przykładzie? – ORM

+0

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. –

2

To po prostu nie jest; zamiast tego możesz użyć __isset. Jest to określone jako 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")