PHP 变量对象属性

PHP Variable object properties

提问人:Rahul Bhanushali 提问时间:4/4/2014 更新时间:4/4/2014 访问量:285

问:

我理解PHP中变量的概念。 根据我对PHP中变量的理解,代码如下:

$foo = 'hello';
$$foo = 'world';

echo $foo . ' ' . $hello;

将生成输出为:

Hello World

但是我发现很难理解可变对象属性的情况

假设我有一个名为 foo 的类,其单个属性如下:

class foo {    
    var $r   = 'I am r.';
}

现在,创建类 foo 的实例并使用变量变量的概念,代码如下:

$foo = new foo();

$bar = 'r';
echo $foo->$bar;

将输出:

I am r.

直到一切正常,但是当我包含一个具有数组值的属性时,它对我来说会搞砸。 例如,我将另一个具有数组值的属性添加到类 foo 中,现在该类如下所示:

class foo {    
    var $arr = array('I am A.', 'I am B.', 'I am C.');
    var $r   = 'I am r.';
}

现在,当我创建类 foo 的实例并尝试读取属性 $arr[1] 时,如下所示:

$arr = 'arr';
echo $foo->$arr[1];

其中输出:

I am r.

输出对我来说看起来很奇怪。我的意思是 $foo->$arr[1] 如何解析到类 foo 中的属性$r?

不应该将 $foo->$arr 解析为 $foo->arr[1](注意:没有美元符号)给出输出:

I am B.

这是怎么发生的?

我知道做 $foor{$arr}[1] 会输出“我是 B”。

我的问题是为什么 $foo->$arr 不能解析为 $foo->arr ?假设变量 $arr 的值为 'arr' ?

给管理员/主管的注意事项:这个问题不是重复的;我尝试搜索类似的问题,但没有一个问题回答我需要知道的问题。

PHP 数组 变量

评论


答:

7赞 Kromey 4/4/2014 #1
class foo {    
    var $arr = array('I am A.', 'I am B.', 'I am C.');
    var $r   = 'I am r.';
}

$foo = new foo;
$arr = 'arr';
echo $foo->$arr[1];

这是优先顺序在这里咬你。最后一行可以改写为

echo $foo->{$arr[1]};

由于字符串是从索引 0 开始的数组,因此引用“arr”中的第二个字符,即“r”,并导致打印字符串“I am r”。$arr[1]

为了得到你所期望的结果,你需要明确地告诉PHP表达式的哪一部分是变量名,因为默认情况下,它贪婪地获取了几乎所有的东西。将最后一行替换为 this 将获得您期望的输出:

echo $foo->{$arr}[1];

这将计算为其完整的字符串“arr”,然后将其用作 ;然后,索引将获取该数组中的第二个条目,“我是 B”。$arr$arrfoo

评论

0赞 Kromey 4/4/2014
那里非常酷的网站,@KarolyHorvath。以下是我的完整答案的概念验证:ideone.com/VGmLP8
0赞 Rahul Bhanushali 4/4/2014
我知道您使用大括号提供的解决方案,我已经在我的问题中提到了它。你的回答为我节省了很多时间。谢谢。我尝试接受答案,但堆栈溢出说我无法在 4 分钟内接受答案。再次感谢你,伙计。
0赞 Kromey 4/4/2014
啊,当我开始写我的答案时,你没有用大括号添加那一点(或者我不知何故忽略了它)。尽管如此,在答案中查看完整的上下文还是很有帮助的,所以我就不说了。
0赞 Rahul Bhanushali 4/4/2014
我从一开始就有。但这不是问题。你解决了我的问题,谢谢朋友。