2010-02-21 4 views

Antwort

19

Weil es __isset überprüft, anstatt es mit __get abzurufen.

Es ist eine viel bessere Option, __isset aufzurufen, da es keinen Standard gibt, was leer ist. Vielleicht ist im Rahmen der Klasse null ein akzeptabler Wert. Sie könnten auch eine Klasse haben, die, wenn das Element nicht existiert, ein neues leeres Objekt zurückgibt, das isset($myObj->item) bricht, da es in diesem Fall immer true zurückgibt.

0

Die magische Funktion __get wird nur aufgerufen, wenn Sie versuchen, auf eine Eigenschaft zuzugreifen, die nicht existiert. Überprüfen, ob eine Eigenschaft vorhanden ist, ist nicht dasselbe wie das Abrufen.

1

Nein, __get sollte nicht ausgelöst werden, wenn Sie feststellen möchten, ob eine Eigenschaft festgelegt ist: Testen, ob eine Eigenschaft festgelegt ist, ist nicht dasselbe wie das Abrufen des Werts.

Mit isset löst die __isset magische Methode.

See:

+0

Scheint, ich habe in meinem Beispiel __isset nicht definiert? – ORM

+0

Scheint, dass du es nicht getan hast - aber, wenn du es definiert hättest, hätte es heißen sollen ;; und es zu definieren oder nicht, ändert nichts daran, dass "__get" beim Testen nicht aufgerufen wird, wenn eine Eigenschaft festgelegt ist. –

2

Es ist einfach nicht; Sie können stattdessen __isset verwenden. Dies ist ausgelegt 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") 
Verwandte Themen