class a {
function __get($property){...}
}
$obj = new a();
var_dump(isset($obj->newproperty));
Parece que la respuesta es correcta pero ¿por qué?Will isset() desencadenar __get y por qué?
class a {
function __get($property){...}
}
$obj = new a();
var_dump(isset($obj->newproperty));
Parece que la respuesta es correcta pero ¿por qué?Will isset() desencadenar __get y por qué?
Porque comprueba __isset en lugar de recuperarlo con __get.
Es una opción mucho mejor para llamar a __isset, ya que no hay un estándar sobre lo que está vacío. Tal vez en el contexto de la clase nula es un valor aceptable. También podría tener una clase que, si el miembro no existiera, devolviera un nuevo objeto vacío, que rompería isset($myObj->item)
, ya que en ese caso siempre devolvería verdadero.
La función mágica __get solo se invoca cuando intenta acceder a una propiedad que no existe. Comprobar si una propiedad existe no es lo mismo que recuperarla.
No, __get
no debe activarse cuando está tratando de determinar si una propiedad está configurada: probar si se establece una propiedad no es lo mismo que tratar de obtener su valor.
El uso de isset
activa el método mágico __isset
.
Ver:
simplemente no es; puedes usar __isset en su lugar. Esto se presenta 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")
Parece que no definí __isset en mi ejemplo? – ORM
Parece que no lo hizo, de hecho, pero, si lo hubiera definido, debería haberse llamado ;; y definirlo o no, no cambia nada acerca de que '__get' no se invoque cuando se prueba si se establece una propiedad. –