Подтвердить что ты не робот

Isset() с динамическими именами свойств

Почему 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!
4b9b3361

Ответ 1

Попробуйте добавить фигурные скобки вокруг имени свойства...

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

CodePad.

Ответ 2

Отвечал на мой вопрос:)

Пошел с помощью кода и узнал, что

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

Я собираюсь принять alex-ответ, поскольку он указал мне в правильном направлении. Спасибо всем!