2014-04-03 228 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