Почему isset()
не работает, когда имена свойств находятся в переменных?
$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 ] ) );
выводит следующее:
object(stdClass)#39 (1) {
["tst"]=>
array(2) {
["one"]=>
int(1)
["two"]=>
int(2)
}
}
bool(true)
bool(false) // was expecting true here..
Изменить: продолжал играть с кодом и узнал, что
var_dump( $Object->$tst['one'] );
выводит уведомление:
E_NOTICE: Undefined property: stdClass::$t
Итак, я думаю, проблема в том, что часть $tst[...]
оценивается в "строчном режиме" (оценивая первый символ в строке, в данном случае "t" ), прежде чем перейти к извлечению свойства из объекта;
var_dump( $tst, $tst['one'] ); // string(3) "tst" string(1) "t"
Решение: заключается в том, чтобы поместить скобки вокруг имени переменной ($this->{$tst}
), чтобы заставить интерпретатор сначала получить его значение, а затем оценить часть [...]
:
var_dump( $Object->{$tst}['one'] ); // int(1) yay!