2012-02-17 33 views
7

當在PHP 5.4上測試「面向未來的」代碼時,我收到了一個我不明白的警告。我的數組索引是「非法字符串偏移量」?

function __clone() { 
    $this->changed = TRUE; 
    foreach ($this->conditions as $key => $condition) { 
    if (
    $condition['field'] 
    instanceOf QueryConditionInterface) { 
     $this->conditions[$key]['field'] = clone($condition['field']); 
    } 
    } 
} 

我爆發了$condition['field']到它自己的行,以減少代碼量的集中地。關於特定線路,PHP有這樣一段話

警告:非法串在DatabaseCondition->__clone()

偏移'field'我只是不明白「場」怎麼樣,是一個非法的字符串偏移量。我猜測我只是錯過了一些明顯的東西,但如果社區找不到問題,我會提交一份錯誤報告。

我將此警告解釋爲「」在任何情況下,「字段」都不是有效的密鑰「。如果我曾試圖將數組作爲關鍵字,那麼這個錯誤是有道理的。

+0

代碼審查是爲了改進工作代碼。關於警告含義的具體問題在那裏是無關緊要的。 – 2012-02-17 21:13:09

+1

你可以'var_dump('$ this-> conditions');'? – 2012-02-17 21:29:34

+0

在PHP 5.4下安裝Drupal時也會出現這個錯誤http://drupal.org/node/1483986我相信PHP 5.4中的某些內容已經損壞,或者'field'現在是一個保留的PHP關鍵字,不能用於數組,但我傾向於PHP錯誤。據報道,在PHP上的以前版本中不會發生此錯誤。 – Brain2000 2012-03-21 15:14:37

回答

2

該警告看起來像它的說法,$condition是一個字符串。沒有任何關於代碼的知識,我不認爲這是否合理。

+0

Bah,你說得對。正如上面「Mike Purcell」所建議的那樣,當var_dump $條件發生錯誤時,它似乎有時會變成一個字符串。 – Letharion 2012-02-19 21:46:58

3

沒有關於創建條件數組/迭代器的更多知識,我只能假設你應該首先檢查偏移量是否存在。

if(isset($condition['field']) && $condition['field'] instanceOf QueryConditionInterface) 

使用isset在這種情況下是足夠的,比array_key_exists更快,唯一的區別是,如果$條件[「場」]爲NULL isset將返回跌倒,array_key_exists將返回true,引起鍵存在。但是因爲您只想處理QueryConditionInterface實例的字段,所以您可以使用isset正常運行。

+0

這可能是我慢了,但我不明白這是如何適用的?如果這是關於「現場」不存在的通知,那麼我將不會有任何問題回溯問題並找出問題的根源。但現在,我讀錯誤的方式是,在任何情況下,'字段'都不是有效的key_;這對我沒有意義。還將此添加到問題中。 – Letharion 2012-02-17 19:14:23

+0

如果$ condition是沒有數組或數組對象的實現,那麼你試圖訪問字符串,你不能訪問字符串字符串數組作爲鍵,並獲得非法的字符串偏移錯誤,這是我的新看到的錯誤在5.4大多數情況下,我在6.0分支上看到它...... – 2012-02-18 22:49:53

+0

例如,$ condition的值可以是'AND'。 – olleolleolle 2012-11-29 06:56:50