当属性名称在变量中时,为什么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}}部分:
[...]
答案 0 :(得分:9)
答案 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'] );
我将接受亚历克斯的回答,因为它指出了正确的方向。谢谢大家!