PHP变量变量是如何工作的?

3
我知道PHP的变量变量是如何工作的,但我不明白为什么这段代码输出"I am r."而不是"I am B."。
<?php
class fooo {
    var $bar = 'I am bar.';
    var $arr = array('I am A.', 'I am B.', 'I am C.');
    var $r   = 'I am r.';
}
$fooo = new fooo();
$arr = 'arr';
echo $fooo->$arr[1] . "\n";
//above line output
//I am r.
?> 

类中的 $arr 属于该类(它的属性)。当你在 fooo() 中设置 $arr 时,你会这样做:$fooo->arr = 'arr';。现在你设置的 $arr 属于普通作用域,而不是类 fooo 的实例对象内部的作用域。尝试在 Google 上搜索一下作用域在编程中的工作原理,这将变得更加清晰 :) - user1467267
foo 类中的 $arr 被封装起来,并且指向不同的内存地址,与 $arr 变量指向的地址不同。 - zkanoca
1
@SamDufel 那能帮助他什么?我们并不都具有相同的技能水平或学习速度。我们应该像对待有经验的人一样接纳新手编码者,并根据他们的技能水平调整我们的回应。 - user1467267
显然$fooo->$arr[1]等同于$fooo->{$arr[1]} - Musa
1
@Allendar - 我的观点是这是一种极其晦涩的访问属性的方式。如果你想测试某人对语言的了解,那么这样的结构是可以接受的,但这也是你永远不需要使用的东西。此外,我将其写为注释而非答案... - Sam Dufel
3个回答

5

你正在定义 $arr = 'arr';,然后从字符串“arr”中获取第二个字符,而不是 Foo 类内的数组。这就是为什么你会得到“r”([1] 返回单词中的第二个字符)。

解决方法? 你应该替换为:

echo $fooo->$arr[1] . "\n";

使用:

echo $fooo->arr[1] . "\n";

您应该会收到您所期望的输出结果:
'I am B.'

0

当您引用对象属性时,它是变量的名称,而不是变量本身。因此,您需要执行以下操作:

echo $fooo->arr[1] . "\n";

为了得到你期望的结果。

0
要得到“我是B”,
你需要先解析$arr
echo $fooo->${$arr}[1]

原因是变量的作用域为$arr='arr'而不是属性$arr=array


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接