我试图理解初始化变量的重要性,然后在极少数情况下为它赋值,例如,你可能在循环中创建一个数组。
例如;
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
,其中包含在使用前需要初始化的所有变量,如本文中的示例所示?
答案 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中被认为是一种奇怪的东西,它会产生通知和警告级错误,试图引起你的注意。
当然,您可以关闭此级别的报告错误或报告所有错误。但是当关闭通知和警告时,你会错过什么时候会发生真正奇怪的事情,对吗?