2

可能重复:
PHP:“注意:未定义的变量”和“注意:未定义的索引”

最近打开了错误,我在递增到新数组索引的行上捕获了未定义索引和未定义偏移错误。

这是一个非常基本的例子。

for($i = 0; $i<10; $i++)
{
    $arr['var1'] += $val1[$i];
    $arr['var2'] += $val2[$i];
}

我收到错误是因为在第一次迭代时 $arr['var1'] 没有设置。

我发现两者都检查索引是否已设置

if (!isset($arr['var1'])) {
    $arr['var1'] = 0;
}
$arr['var1'] += $val1[$i];

• 和 •</p>

在递增的 forloop 之前自动将索引设置为 0 并停止错误消息。

我的问题是我将有大约 150 个这些问题要解决,解决这个问题的最佳方法是什么。检查每一个的isset,还是预先用0 val 定义每一个?

4

5 回答 5

3

您应该始终初始化变量。这绝对是几乎所有语言的最佳实践,访问未设置的变量被认为是一种极坏的习惯。您应该始终在开发带有错误软件。

您的代码应为:

$arr['var1'] = $arr['var2'] = 0;
for($i = 0; $i<10; $i++)
{
    $arr['var1'] += $val1[$i];
    $arr['var2'] += $val2[$i];
}

接受打击,修复所有 150 次出现的这个问题,然后从错误中吸取教训。下次正确编写代码。

于 2012-08-20T15:37:17.210 回答
1

这是个人喜好,因为任何一种选择都会产生相同的功能。但是,提前声明它将为您节省条件调用和函数调用(将在循环中重复),因此从效率的角度来看,最好在循环之前声明它。通常,最佳实践是在使用变量之前声明它们。但是,PHP 可以让您摆脱这种情况,这就是它不是必需的原因。

于 2012-08-20T15:37:15.773 回答
1

首先初始化,然后迭代:

$arr['var1'] = 0;
$arr['var2'] = 0;
for($i = 0; $i<10; $i++)
{
    $arr['var1'] += $val1[$i];
    $arr['var2'] += $val2[$i];
}

这是更具可读性的代码 - 比你一直在做的更好的做法。

如果您必须初始化一个包含许多计数器的数组,您可能会执行以下操作:

$arr = array('counter1' => 0, 'counter2' => 0, 'counter3' => 0);
于 2012-08-20T15:37:36.570 回答
1

如果您通过引用访问它们,则数组条目将产生(自动激活)。因此:

for($i = 0; $i < 10; $i++) {
    $var1 =& $arr['var1'];
    $var2 =& $arr['var2'];
    $var1 += $val1[$i];
    $var2 += $val2[$i];
}

甚至数组本身也不需要声明。默认情况下,新条目的值为 NULL,添加时将转换为 0。

于 2012-08-20T16:14:35.693 回答
0

您应该修复这些区域,只是为了良好的编码实践。您采用的方法实际上取决于您的代码。如果您真的在使用新变量,那么只需将它们定义为 false、0、'' 或任何有意义的变量作为相关变量的默认值。

如果您在代码中可能有或没有值集的位置(例如评估 $_POST 或 $_GET 数组),则使用isset(),empty()或类似方法来评估它。

于 2012-08-20T15:39:08.350 回答