2011-06-20 57 views
5

之前分配陣列()我試圖找到一個適當的和解釋性冠軍,但我做不到,我會盡量解釋什麼,我問在這裏:採用可變像陣列

一般來說,如果你不分配一個空數組變量,你就可以開始索引分配值是這樣的:

$hello["world"] = "Hello World"; 
... 
echo $hello["world"]; 

但我總是會遇到這樣的定義:

$hello = array() //assigning an empty array first 
$hello["hello"] = "World"; 
... 
echo $hello["hello"]; 

爲什麼用了很多。第二個有性能增益嗎?

謝謝。

+1

哦天啊,第一個真的有效嗎?我總是發現討厭PHP的新理由... –

+0

是的,只要PHP引擎的索引,它解釋爲數組。你不必使用array()來聲明一些數組。 – Tarik

+1

後者是一種很好的做法,它可以防止另一個編碼器猜測* OK,因此可能會將$ hello聲明在其他地方,可能在另一個文件*中。 –

回答

7

兩個原因:

  • 更好的可讀性(你知道數組在這一點初始化)
  • 安全 - 當在系統上運行register_globals使用戶可以添加例如hello[moo]=something添加到查詢字符串中,並且數組已經用此初始化。 $hello = array();雖然自創建新數組以來覆蓋此值。
+1

這聽起來很棒。謝謝.... – Tarik

3
$hello = array(); 

if(someConditionIsTrue){ 
    $hello["world"] = "Hello World"; 
} 

foreach($hello as $val){  // this will not give you any error or warning. 
    echo $val;  
} 

if(someConditionIsTrue){ 
    $hello["world"] = "Hello World"; 
} 

foreach($hello as $val){  // this will give you error . 
    echo $val;  
} 
4

初始化的變量是好的做法
就拿這一點:

$foo = 'bar'; 

// 10 lines and 1 year later 
$foo['baz'] = 'test'; 

恭喜你,你現在有串"tar"

這可能會意外發生並引入不必要的錯誤。條件變量創建會變得更糟。通過明確初始化變量的好習慣很容易避免。

+0

多麼奇怪的行爲,不敢相信它,所以我試了一下... – martinstoeckli

+0

得愛PHP,不是嗎? ;) – deceze

2

如果我沒有記錯的話,如果您有error_reporting作爲E_ALL,第一個會產生PHP警告。你應該總是使用第二種方法,因爲它明確地初始化了一個新的數組。如果您正在查看代碼並從不知所云看到$hello["hello"],但不記得以前看到對$hello的任何引用,這會造成混淆。

如果你做$hello[] = "World"同樣會發生,警告將顯示