在使用[]添加值之前是否有必要声明PHP数组?

时间:2011-11-23 16:54:57

标签: php arrays

$arr = array(); // is this line needed?
$arr[] = 5;

我知道它在没有第一行的情况下有效,但它通常包含在实践中。

是什么原因?没有它会不安全吗?

我知道你也可以这样做:

 $arr = array(5);

但我在谈论你需要逐个添加项目的情况。

13 个答案:

答案 0 :(得分:87)

如果您没有声明新数组,并且创建/更新数组的数据因任何原因失败,那么尝试使用该数组的任何未来代码都将E_FATAL,因为该数组不存在

例如,如果未声明数组并且未向其添加任何值,则foreach()将抛出错误。但是,如果数组只是空的,则不会发生错误,就像您声明它一样。

答案 1 :(得分:23)

只是想指出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尚不存在,则会创建它,因此这也是创建数组的另一种方法。”

但是,正如其他答案所说......你真的应该为你的变量声明一个值,因为如果你不这样做会发生各种坏事。

答案 2 :(得分:14)

Php是一种松散类型的语言。这完全可以接受。话虽这么说,真正的程序员总是声明他们的变种。

答案 3 :(得分:6)

想想追随你的程序员!如果您只看到$arr[] = 5,则在不阅读范围中的所有上述代码的情况下,您不知道$arr可能是什么。明确的$arr = array()行明确了这一点。

答案 4 :(得分:4)

这只是一种很好的做法。假设您在循环中附加了数组(相当普遍的做法),但随后在所述循环之外访问数组。如果没有数组声明,如果你从未进入循环,你的代码就会抛出错误。

答案 5 :(得分:3)

我强烈建议在添加值之前声明数组。除了上面提到的所有内容,如果数组在循环内,您可能会无意中将元素推入数组。我刚观察到这会造成一个代价高昂的错误。

//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
       }
}

答案 6 :(得分:1)

通过在使用数组之前不声明它确实会引起问题。 我刚刚发现的一种经验是,我这样调用此测试脚本:indextest.php?file = 1STLSPGTGUS 这可以按预期工作。

//indextest.php?file=1STLSPGTGUS
$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");// should give: "Notice: Undefined index: file"
print ("file = " . $file);// should give: "Notice: Undefined index: file"

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = myindex.tpl.php
file['otherthing'] = otherthing
file['iamempty'] =

Notice: Undefined index: file in D:\Server\Apache24\htdocs\DeliverText\indextest.php on line 14
file['file'] =

Notice: Array to string conversion in D:\Server\Apache24\htdocs\DeliverText\indextest.php on line 15
file = Array
*/

现在我只需要我购买的另一个脚本中的文件,就在我的顶部,我们可以看到数组$ file的值完全错误,而数组$ path可以: “ checkgroup.php”是有罪的。

//indextest.php?file=1STLSPGTGUS
require_once($_SERVER['DOCUMENT_ROOT']."/IniConfig.php");
$access = "PUBLIC";
require_once(CONFPATH . "include_secure/checkgroup.php");
$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing.php';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");
print ("file = " . $file);

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = o
file['otherthing'] = o
file['iamempty'] = o
file['file'] = o
file = oSTLSPGTGUS
*/

先初始化数组,然后没问题!

//indextest.php?file=1STLSPGTGUS
require_once($_SERVER['DOCUMENT_ROOT']."/IniConfig.php");
$access = "PUBLIC";
require_once(CONFPATH . "include_secure/checkgroup.php");

$path = array();
$file = array();

$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing.php';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");
print ("file = " . $file);

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = myindex.tpl.php
file['otherthing'] = otherthing.php
file['iamempty'] =
file['file'] =
file = Array
*/

这就是我意识到初始化变量的重要性,因为我们永远不知道以后会遇到什么问题,而只是为了节省时间,最终可能会浪费更多。 我希望这会对像我这样不专业的人有所帮助。

答案 7 :(得分:1)

古老的问题,但我也同意,因为这是一个用例,如果不声明数组,代码会更简单。

假设您有一个需要在其属性之一上建立索引的对象列表。

// $list is array of objects, all having $key property.
$index = [];
foreach ($list as $item)
    $index[$item->key][] = $item; // Dont care if $index[$item->key] already exists or not.

答案 8 :(得分:0)

这取决于您的错误检查。如果你有关于严格的错误报告,它会给你一个通知,但它在没有它的情况下仍然可以在技术上工作。

答案 9 :(得分:0)

当你需要它作为全局变量或想要在不同的函数中一次又一次地重用相同的数组时,它是好的

答案 10 :(得分:0)

这是您的代码

$var[]  = 2;
print_r($var)

工作正常!直到有人在您的迷人代码之前声明相同的变量名

$var = 3; 

$var[]  = 2;
print_r($var)
  

警告:不能将标量值用作数组

糟糕!

这是一种可能(有时无法预测)的情况,因此需要$var = array()

$var = 3;
$var = array();
$var[]  = 2;
print_r($var)

输出

Array
(
    [0] => 2
)

答案 11 :(得分:0)

对于foreach循环,如果不确定数据,则可以执行以下操作:

foreach($users ?? [] as $user) {
    // Do things with $user
}

如果未设置$users(空合并会进行isset($users)),则会得到空数组[],因此PHP不会像这样循环foreach无需循环-没有错误,警告或通知。

我不同意评论/答案中的某些内容,我不认为您只是为了某种安全网络而仅仅为了声明它而声明空数组或初始化变量。我认为这样的方法是不好的编程。必要时明确进行操作。

老实说,如果您必须初始化一个空数组,请考虑,如果代码可以更好地结构化,以后如何检查数据等等。

以下代码是毫无意义的,它并没有显示“意图”,它只会使人们对其初始化的原因感到困惑(充其量只是阅读和处理毫无意义):

$user = [];
$user['name'] = ['bob'];

第二行还声明了新数组,并且永远不会失败。

答案 12 :(得分:-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

?>