【问题标题】:isset() with dynamic property namesisset() 具有动态属性名称
【发布时间】: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'] 不存在。尝试回应它。

标签: php oop


【解决方案1】:

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

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

CodePad.

【讨论】:

  • 有效!你是英雄。想解释一下这里到底发生了什么? :)
  • @Rijk 自己想办法。我的预感是运算符优先级,尽管 PHP doesn't define 是 -> 的优先级(尽管它确实定义了数组下标 [ 运算符)。
  • var_dump( $Object->$tst['one'] ); 输出E_NOTICE: Undefined property: stdClass::$t.. 也许$tst[...] 部分首先被评估为“作为字符串”?
【解决方案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'] );

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

【讨论】:

  • 现在在 PHP 7 中,他们似乎终于改变了这种行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 2012-08-21
  • 1970-01-01
  • 2013-07-23
相关资源
最近更新 更多