2011-11-23 108 views
66
$arr = array(); // is this line needed? 
$arr[] = 5; 

我知道它沒有第一行,但它通常包含在實踐中。在用[]添加值之前是否需要聲明PHP數組?

是什麼原因?沒有它就不安全?

我知道你也可以這樣做:

$arr = array(5); 

,但我說的是,你需要通過一個新增項目1例。

+2

除非您喜歡關於未聲明的變量的通知,否則我會建議初始化。另外,它只是用於清晰的代碼(很明顯'$ foo = array()'並且它不是一個字符串轉入數組等)。 –

+5

@布拉德克里斯蒂:除非沒有觸發這樣的通知。 – BoltClock

+3

@BoltClock:取決於[你正在使用的版本](https://bugs.php.net/bug.php?id=28151)。 –

回答

77

如果您沒有聲明新的數組,並且創建/更新數組的數據因任何原因而失敗,那麼任何未來嘗試使用該數組的代碼將會由於該數組不存在而存在​​。

例如,如果未聲明數組並且未向其添加任何值,則foreach()將引發錯誤。但是,如果數組只是空的,則不會發生錯誤,就像您聲明的那樣。

+0

Upvoted是因爲'foreach'示例和錯誤被觸發的事實顯然取決於您正在運行的PHP版本。 – cspray

+0

我不明白這個答案。沒有聲明和沒有添加的東西意味着我沒有寫入源代碼。 – Gordon

+2

@Gordon,如果$ something不等於1,那麼這個例子就不能正常工作:if($ something == 1){$ rows [] =「a」; $ rows [] =「b」; } foreach($ rows as $ row){}如果將$ rows聲明爲$ rows = array(),那麼錯誤可能會被避免。在if語句發生之前。 – djdy

4

這只是一個很好的做法。假設你在一個循環內追加數組(相當普遍的做法),但是然後在所述循環之外訪問數組。如果沒有數組聲明,如果你從未進入循環,你的代碼會拋出錯誤。

0

這取決於你的錯誤檢查。如果你有嚴格的錯誤報告,它會給你一個通知,但它應該仍然在技術上沒有它。

0

它在好的情況下,當你需要它作爲一個全局變量或希望在不同的功能

13

PHP是一種鬆散類型的語言一次又一次地重複使用相同的陣列。這是完全可以接受的。話雖如此,真正的程序員總是宣佈他們的變數。

+26

[真正的程序員](https://www.xkcd.com/378/) – Gordon

+1

@Gordon正是我在想什麼;) – AlienWebguy

-1

同意@djdy,只是一個替代我很樂意發佈:

<?php 

// Passed array is empty, so we'll never have $items variable available. 
foreach (array() AS $item) 
    $items[] = $item; 

isset($items) OR $items = array(); // Declare $items variable if it doesn't exist 

?> 
+0

這些都有什麼意義?似乎沒什麼好說的。 – BoltClock

+0

而不是預先聲明$ items變量,你會檢查存在一個循環,就這樣。 – Otar

21

只是想指出的是,PHP documentation on arrays實際上是在文檔中關於這個會談。

從PHP站點,伴隨代碼片段:

$arr[key] = value; 
$arr[] = value; 
// key may be an integer or string 
// value may be any value of any type 

「如果$arr不存在,它將被創建,所以這也是創建一個數組的另一種方式。」

但是,正如其他答案所述......你應該爲你的變量聲明一個值,因爲如果你不這樣做,所有壞的事情都會發生。

6

想想你身後的編碼員!如果您剛剛看到$arr[] = 5,則不知道$arr可能是什麼,而不讀取範圍中的所有前面的代碼。明確的$arr = array()行明確表示。

+1

在PHP 5.4.x - 5.6.x中:$ arr = []也適用。 –

1

我強烈建議在添加值之前聲明數組。除了上面提到的所有內容之外,如果數組在循環內部,您可能會無意中將元素推入您的數組中。我剛剛觀察到這造成了一個代價高昂的錯誤。

//Example code  
foreach ($mailboxes as $mailbox){ 
     //loop creating email list to get 
     foreach ($emails as $email){ 
      $arr[] = $email; 
     } 
     //loop to get emails 
     foreach ($arr as $email){ 
     //oops now we're getting other peoples emails 
     //in other mailboxes because we didn't initialize the array 
     } 
} 
+0

不要做什麼? – ryanve

+1

@ryanve我編輯了答案 – ykay

相關問題