2012-11-01 19 views
1

我有非常廣泛地使用的代碼,從另一個方法中獲取數組,並且有時返回該數組的第一個元素。鑑於null是一個可接受的函數返回值,是否值得在數組索引上調用isset()的性能開銷(或檢查數組長度等),還是更好地返回不存在的索引(拋開警告)。除阻止警告外,呼叫isset()還有什麼好處。調用isset()與返回未定義索引

下面的例子被簡化了,真正的功能不是只是得到數組的第一個元素。

function get_array_element(){ 
    $array = get_array();  // function that returns array 
    return $array[0];   // return index 0 which may not exist 
} 

對戰,如果索引設置檢查:

可能不存在

回報指數該函數內部

function get_array_element(){ 
    $array = get_array();  // function that returns array 
    return (isset($array[0]))? // check if index 0 isset() else return null 
     $array[0] : 
     null; 
} 
+0

我認爲一個頁面不應該有任何警告或錯誤。我認爲它有助於執行良好的編程規範(看到警告的未來開發人員如何知道這種行爲是有意的而不是忘記邊緣案例?)但是我也沒有看到需要使用'isset()'在數組的一個元素上。相反,我會檢查'$ array'的count()來查看是否至少有一個元素。 –

+0

@StephenBooher在我的強迫症同意,但因爲這被稱爲(幾十)幾千次,我想知道這張支票是否值得性能明智,尤其是考慮到它通常包含一個值。 – doublesharp

+0

好吧,那麼'E_NOTICE'的開銷要少於調用'isset()'函數或吞嚥錯誤的開銷。該功能很可能會花費更多。我一直使用'isset()'認爲這是最佳實踐,但效率可能不高。 – NappingRabbit

回答

2

訪問未定義索引時發出通知 - 理論上 - 應提醒您輸入鍵名中的拼寫錯誤。實際上,如果您首先使用isset,那麼您可能只是在那裏複製了密鑰名稱。或者使用數字索引。或者是一個常數。

另一方面,在大多數情況下,您正在訪問一個索引,並且不管它是否被關心 - 在這種情況下,使用isset只是一種厭煩。很多語言都可以讓你檢索任何沒有警告的索引,例如Javascript:只返回undefined

所以我會建議忽略通知。不是所有的人,因爲在某些情況下真的有幫助,所以讓他們在開發中打開,但通過使用@沉默這樣的數組訪問。是的,這是醜陋的,但它的工作:

return @$array[0]; 

或者在簡單的情況下,也許其他解決方案適合?

return array_shift($array); 
+0

啊,這個'@'是逃離我的東西。在這種情況下,我知道**可以返回一個未定義的索引,但實際上由於此方法產生的所有噪聲而使其他通知更加難以調試。謝謝! – doublesharp

-1

調用isset是半毫無意義的,因爲你是返回null,如果它不」 t存在,但不管是否使用isset,null都將從$ array [0]返回。

如果它只拋出一個E_NOTICE,那麼我不會擔心它,只需檢查get_array_element()== null。

+0

你實際上不能做'isset(get_array_element())'.. –

+0

@RocketHazmat我不認爲他在說函數調用isset ,只是爲了測試結果是否爲'null',我正在做。考慮到它在代碼中少了一個「if」,是否在允許通知方面有任何傷害,或者是否更好地忽略它? – doublesharp

+1

@doublesharp:在之前的編輯中,他擁有該行代碼。他自從刪除它,使我的評論沒有意義。 –