2011-02-07 33 views
1

我已經打開所有的錯誤報告來清理一些未定義的索引,只是爲了讓我的應用程序更加整潔。我注意到一個奇怪的現象:未定義索引有多嚴格?

比方說,我有以下陣列:$a = array('test' => false, 'foo' => 'bar')

如果我做if ($a['nothere']),我得到正確的Undefined index: nothere通知。

但是,如果我做if ($a['test']['nothere']),我不要得到通知。完全一樣。儘管nothere絕對不是$a['test']的索引。

現在,如果我做$a['test'] = array('baz' => 'poof'),然後運行if ($a['test']['nothere'])確實拋出一個通知。

未定義的索引檢查不檢查空數組中的索引嗎?這是在PHP 5.2.8上。

+1

這很可能是因爲[]字符串訪問語法和類型的雜耍。 `$ a = array('test'=> array(),'foo'=>'bar')`會產生一個錯誤 – 2011-02-07 16:03:19

+0

呵呵,謝謝編輯以前copyedit @Piskvor引起的奇怪結構。 :P – Andrew 2011-02-07 16:03:45

回答

4

這是因爲棘手的類型雜耍。 $ a ['test']被轉換爲[空]字符串,然後'無處'被轉換爲0,然後PHP嘗試在空字符串中查找0的符號。它變成子字符串操作,而不是變量查找,所以不會引發錯誤。

嘖嘖,一個人說的一樣:http://php.net/manual/en/language.types.type-juggling.php

從我的經驗,一個奇怪的例子:
通過超級鏈接index.php?sname=p_edit&page=0被請求,一個代碼

if (isset($_GET['sname'])) { $page['current'] = $_GET['sname'].'.php'; }; 
echo $page['current']; 

只產生一個字母"p"

我計算了6個步驟和2個類型演員,最後得出了這樣的結果。
(提示:問這個問題的可憐的傢伙註冊了全局變量)