初始化变量的重要性?

时间:2011-12-08 06:22:22

标签: php variables initialization

我试图理解初始化变量的重要性,然后在极少数情况下为它赋值,例如,你可能在循环中创建一个数组。

例如;

foreach($var1 as $key => $val) {
    $array[] = $key;
}

在这个例子中,$array在用于包含数组之前尚未被声明,我被告知这是不好的做法,但我不知道为什么。我被建议改为做这件事;

$array = array();

foreach($var1 as $key => $val) {
    $array[] = $key;
}

另一个例子,当根据许多数组值构造一个长字符串时:

$size = count($array);
for($i = 0; $i < $size; $i++) {
    $string .= $array[$i]."del".$array_2[$i].",";
}

我被告知应该这样做

$string = null;

$size = count($array);
for($i = 0; $i < $size; $i++) {
    $string .= $array[$i]."del".$array_2[$i].",";
}

我想知道为什么在这两种情况下,建议在为其分配数据之前初始化变量?或者不是这种情况,我只是听错了。如果确实存在,此规则是否有例外?

更新:这是在此函数中初始化变量的正确方法吗?

function weight_index($keyword, $src, $alt, $content, $ratio='3:3:1') {
    // Initialize needed variables
    $content_index = ''; $src_index = ''; $alt_index = '';

    // Create all four types of $keyword variations: -, _, %20, in order to search 
    // through $content, $alt, $src for instances.
    $keyword_fmt = array('hyphen' => str_replace(' ', '-', $keyword), 'underscore' => str_replace(' ', '_', $keyword), 'encode' => urlencode($keyword), 'original' => $keyword);

    // Define weight index for each instance within a searchable "haystack".
    list($src_weight, $alt_weight, $content_weight) = explode(':', $ratio);

    // Get the number of instances of $keyword in each haystack for all variations.
    foreach($keyword_fmt as $key => $value) {
        $content_index += substr_count($value, $content); // .. may generate an error as $x_index hasn't been initialized.
        $src_index += substr_count($value, $src);
        $alt_index += substr_count($value, $alt);
    }

    // Multiply each instance by the correct ratio.
    $content_index = $content_index * $content_weight;
    $src_index = $src_index * $src_weight;
    $alt_index = $alt_index * $alt_weight;

    // Total up all instances, giving a final $weight_index.
    $weight_index = $content_index + $src_index + $alt_index;

    return $weight_index; 
}

或者在global$content_index$src_index之类的变量前面使用$alt_index关键字更为谨慎,并在单独的文件中初始化它们包括ie init_variables.php,其中包含在使用前需要初始化的所有变量,如本文中的示例所示?

4 个答案:

答案 0 :(得分:4)

如果你正在循环的东西恰好是一个空数组,会发生什么?然后结束$array$string从未被定义,所以当某些东西试图引用它时,你的程序会做坏事。

$var1 = array();
foreach($var1 as $key => $val) {
    $array[] = $key;
}
foreach($array as $v) { // errors because $array isn't defined
...
}

答案 1 :(得分:2)

首先,不初始化数组会发出警告。你的代码不应该这样做。

此外,如果您不小心在示波器中使用了同名的现有数组,会发生什么?这可能导致难以追踪错误。

在第二个示例中,我将字符串初始化为空字符串(''),而不是null

答案 2 :(得分:1)

这些代码块会抛出警告。

$string .= "asdf";

只是

的简写
$string = $string . $asdf

由于右侧未定义,因此会发出通知Undefined variable: string。尝试将元素添加到未定义的数组中时,您会得到类似的通知。

将变量初始化为默认值也使代码更易于阅读(程序员所做的大部分实际上是读取代码,而不是编写代码)。当您看到作业$string = ''时,您需要牢记这一点。当你不能凭空汲取变量时,它会使代码更容易遵循。

最后,值得注意的是,php是少数几种广泛使用的语言之一,你可以在这些语言中完成这样的事情(它只会引发警告,而不是错误)。大多数语言只会导致错误而根本不会运行。

答案 3 :(得分:0)

因为使用未初始化的变量在PHP中被认为是一种奇怪的东西,它会产生通知和警告级错误,试图引起你的注意。

当然,您可以关闭此级别的报告错误或报告所有错误。但是当关闭通知和警告时,你会错过什么时候会发生真正奇怪的事情,对吗?