2014-04-03 182 views
3

我理解PHP中变量变量的概念。 据我变量变量在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的实例,并且尝试读取属性$的常用3 [1]如下:

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

,其输出:

I am r. 

和输出看起来很奇怪。我的意思是$ foo - > $ arr [1]如何在类foo中解析为properry $ r?

不应该做$ FOO - > $编曲解析为$ foo->改编 [1](:没有美元符号)给出的输出:

I am B. 

如何这是否发生?

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

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

给管理员/主管的说明:这个问题不是重复的;我试图寻找类似的问题,但没有回答我需要知道的问题。

回答

7
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[1]引用的“改编”,即“R”,并在打印字符串结果“我是R中的第二个字符'。

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

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

这将评估$arr充分发挥其字符串“改编”,然后使用该作为foo的标签类成员$arr;该指数将抓住该阵列中的第二个条目,'我是B'。

+1

只是想发布相同的东西 - http://ideone.com/7s8stM –

+0

非常酷的网站,@KarolyHorvath。这里是我的完整答案的概念证明:http://ideone.com/VGmLP8 – Kromey

+0

我知道你使用大括号提供的解决方案,我也已经在我的问题中提到了它。 而你的回答节省了我很多时间。非常感谢你。 我试着接受答案,但堆栈溢出说我不能接受4分钟内的答案。再次感谢你的队友。 – mystic