2011-11-23 141 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

相关问题