¿Por qué isset()
no funciona cuando los nombres de propiedad están en variables?isset() con nombres de propiedad dinámicos
$Object = new stdClass();
$Object->tst = array('one' => 1, 'two' => 2);
$tst = 'tst'; $one = 'one';
var_dump($Object, isset($Object->tst['one']), isset($Object->$tst[ $one ]));
da el siguiente resultado:
object(stdClass)#39 (1) {
["tst"]=>
array(2) {
["one"]=>
int(1)
["two"]=>
int(2)
}
}
bool(true)
bool(false) // was expecting true here..
Editar: continuaron jugando un poco con el código, y descubrió que
var_dump($Object->$tst['one']);
emite un Aviso:
E_NOTICE: Undefined property: stdClass::$t
Creo que el problema es que la parte $tst[...]
se evalúa en 'modo cadena' (evaluando el primer carácter de la cadena; en este caso "t"), antes de ir a buscar la propiedad del objeto;
var_dump($tst, $tst['one']); // string(3) "tst" string(1) "t"
Solución: es poner los apoyos alrededor del nombre de la variable ($this->{$tst}
), para decirle al intérprete para recuperar su valor primero, y luego evaluar la parte [...]
:
var_dump($Object->{$tst}['one']); // int(1) yay!
¿Estás haciendo cosas tan crueles a los pobres 'isset()'? ¿Qué te ha hecho? (En serio, buena pregunta, ¡estoy desconcertado!) –
¿Qué visualiza 'var_dump ($ Object -> $ tst)'? – CodeCaster
El problema es solo la precedencia del operador aquí. '[]' sobre '->' debido a la variable como nombre del atributo. – mario