2013-05-12 39 views
0

更加緊密我對PHP相當陌生,只是有一種學習體驗,我在這裏分享以幫助像我這樣的其他人,可能需要幫助以找到此原因錯誤,也因爲我仍然不知道解決方案是什麼,並且確定只有一種我尚未發現的語法來完成我需要做的事情。PHP:非法字符串偏移,因爲[]綁定比 - >

所以,這個問題可以通過這樣的事情來證明:

class Sample { 
    protected $foo = array(); 
    public function magicSampleSetFunc($property, $key, $value) { 
     $this->$property[$key] = $value; 
    } 
} 
... 
$s = new Sample(); 
$s->magicSampleSetFunc('foo', 'someKey', 'someVal'); 

很顯然,這不是我真正的代碼(我也沒有運行),這只是一個小例子,說明我的情況。這裏我們有一個成員變量foo,它顯然是一個數組和一個泛型函數,它將嘗試設置一個鍵和值。我可以var_dump $this->$property,看到它是一個數組,但在$this->$property[$key]行我得到錯誤消息:「警告:非法字符串偏移'someKey'在...」。

起初我雖然說'someKey'是一個非法的字符串,用作數組偏移量,這是沒有意義的。而且,即使我將它包裝在isset中,它也會抱怨。我學到的第一件事是,如果你在php中有一個字符串,你可以使用數組訪問操作符從字符串中獲取一個字符。所以警告消息實際上是抱怨'someKey'不是一個字符串的有效偏移量(因爲它不是一個整數偏移量)。好吧,但我只是var_dumped $this->$property,看到它是一個數組,所以給了什麼?第二課是運營商優先級之一。數組運算符「[]」比間接運算符「 - >」綁定更緊密。所以,該聲明的綁定實際上是這樣的:($this-> ($property[$key]))。所以,它非法嘗試通過$ key中的索引來抵銷$ property中的字符串。我想要的是通過$ key中的索引抵消$this->$property中的數組。

所以,現在我們來看我的問題。我需要學習的第三課,還沒有弄清楚是如何覆蓋這個運算符優先級問題?我試過​​,但似乎是一個sytax錯誤。有沒有其他的語法可以讓翻譯者理解我的意思?或者,我必須先將$this->$property分配給臨時變量嗎?如果我這樣做,這不是說我的實際成員變量數組沒有更新?我需要臨時參考嗎?這裏我的情況是什麼正確的語法?謝謝!

+0

結束。如果這不是你真正的代碼,而你還沒有運行它,然後你怎麼這麼肯定它代表你的問題? (提示:不是。)首先發布你的真實代碼和任何錯誤信息,所以我們可以給你一個更具體的答案。 – 2013-05-12 23:21:08

+0

沒有看到我真實的代碼,你怎麼知道這不是它的代表?我真正的代碼是很多很多文件,無論我發佈什麼內容,都必須是真實內容的總結,而且總會有我錯誤總結的危險。我覺得這是我正在使用的代碼的精確彙總。我邀請您根據此代碼中的問題來回答問題,如果這不是我的實際問題,因爲我錯誤地總結了那個問題。 – 2013-05-13 00:12:04

回答

2

這是這樣做的: 你的變量名基本上是{$property}所以當你做$this->$property[$key]我覺得PHP解析器會感到困惑。我通常確保明確地向解析器說明我的變量名是$ property,這是通過在變量周圍使用大括號來完成的。

大括號是用來明確指定一個變量名

class Sample { 
    protected $foo = array(); 
    public function magicSampleSetFunc($property, $key, $value) { 
     $this->{$property}[$key] = $value; 
    } 
} 
... 
$s = new Sample(); 
$s->magicSampleSetFunc('foo', 'someKey', 'someVal'); 
+0

澄清:大括號用於動態更改變量/函數名稱,在這種情況下,您希望輸出$ property變量的內容以便將其用作函數名稱或類變量名稱 – xorinzor 2013-05-12 23:44:36

+0

aah ..同意..由於某種原因,我只讀爲「只有函數名」,並沒有提及類變量.. – Dinesh 2013-05-12 23:46:13

+1

http://stackoverflow.com/questions/2596837/curly-braces-in-string-in-php – xorinzor 2013-05-12 23:47:25