class a {
function __get($property){...}
}
$obj = new a();
var_dump(isset($obj->newproperty));
Sembra che la risposta sia negativa, ma perché?Will isset() trigger __get e perché?
class a {
function __get($property){...}
}
$obj = new a();
var_dump(isset($obj->newproperty));
Sembra che la risposta sia negativa, ma perché?Will isset() trigger __get e perché?
Perché controlla __isset anziché recuperarlo utilizzando __get.
È un'opzione molto migliore per chiamare __isset, in quanto non esiste uno standard su ciò che è vuoto. Forse nel contesto della classe null è un valore accettabile. Si potrebbe anche avere una classe che, se il membro non esistesse, ha restituito un nuovo oggetto vuoto, che si romperebbe isset($myObj->item)
come in quel caso verrebbe sempre restituito true.
La funzione magica __get viene chiamata solo quando si tenta di accedere a una proprietà che non esiste. Controllare se esiste una proprietà non è come recuperarla.
No, __get
non deve essere attivato quando si tenta di determinare se una proprietà è impostata: testare se una proprietà è impostata non è la stessa cosa che provare a ottenere il suo valore.
Utilizzando isset
innesca il metodo __isset
magia.
See:
semplicemente non è; puoi invece usare __isset. Questo è disposto 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")
Sembra che non abbia definito __isset nel mio esempio? – ORM
Sembra che non l'abbia fatto, anzi - ma, se l'avessi definito, avrebbe dovuto essere chiamato ;; e la sua definizione o meno non cambia nulla riguardo al fatto che '__get' non venga chiamato quando stai testando se una proprietà è impostata. –