2011-09-05 22 views
10

¿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! 
+2

¿Estás haciendo cosas tan crueles a los pobres 'isset()'? ¿Qué te ha hecho? (En serio, buena pregunta, ¡estoy desconcertado!) –

+0

¿Qué visualiza 'var_dump ($ Object -> $ tst)'? – CodeCaster

+3

El problema es solo la precedencia del operador aquí. '[]' sobre '->' debido a la variable como nombre del atributo. – mario

Respuesta

9

Intente agregar llaves alrededor del nombre de la propiedad ...

isset($Object->{$tst}[ $one ]); 

CodePad.

+0

¡Funciona! Usted es un héroe. ¿Te importa explicar qué está pasando exactamente aquí? :) – Rijk

+0

@Rijk Solo me lo imagino. Mi corazonada es la precedencia del operador, aunque PHP [no define] (http://php.net/manual/en/language.operators.precedence.php) la precedencia para '->' (aunque define el subíndice de la matriz) '[' operador]. – alex

+0

'var_dump ($ Object -> $ tst ['one']);' outputs 'E_NOTICE: Propiedad indefinida: stdClass :: $ t' .. Tal vez la parte' $ tst [...] 'se está evaluando 'como cadena 'primero? – Rijk

0

respondido a mi propia pregunta :)

Fuimos el jugando un poco con el código, y descubrió que

var_dump($Object->$tst['one']); 

emite un Aviso:

E_NOTICE: Undefined property: stdClass::$t 

Así que 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" 

La 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']); 

Voy a aceptar la respuesta de alex, ya que me indicó la dirección correcta. ¡Gracias a todos!

+0

Y ahora en PHP 7, parecían haber cambiado finalmente este comportamiento. – Rijk

Cuestiones relacionadas