带有动态属性名称的isset()

时间:2011-09-05 11:51:22

标签: php oop

当属性名称在变量中时,为什么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})周围添加大括号,告诉解释器首先检索其,然后评估{ {1}}部分:

[...]

2 个答案:

答案 0 :(得分:9)

尝试在属性名称周围添加大括号...

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

CodePad

答案 1 :(得分:0)

回答了我自己的问题:)

继续玩弄代码,发现了

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})周围加上大括号,告诉解释器首先检索其,然后评估[...]部分。 / p>

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

我将接受亚历克斯的回答,因为它指出了正确的方向。谢谢大家!