【发布时间】:2011-09-05 11:51:21
【问题描述】:
为什么当属性名称在变量中时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!
【问题讨论】:
-
你对可怜的
isset()做了这么残忍的事?它曾经对你做过什么? (说真的,好问题,我很困惑!) -
var_dump($Object->$tst)显示什么? -
这里的问题只是运算符优先级。
[]超过->由于变量作为属性名称。 -
@mario 啊,有道理!
-
我认为属性
$Object->$tst['one']不存在。尝试回应它。