Важность инициализации переменной? - PullRequest
2 голосов
/ 08 декабря 2011

Я пытаюсь понять важность инициализации переменной, прежде чем присваивать ей значение в тех редких случаях, когда, например, вы можете создавать массив в цикле.

Например;

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, и инициализировать их в отдельном файле, который будет включен, например, init_variables.php, который будет содержать все переменные, которые должны быть инициализированы перед использованием, как в примерах в этом посте?

Ответы [ 4 ]

4 голосов
/ 08 декабря 2011

Что произойдет, если то, что вы зацикливаете, окажется пустым массивом?Затем вы получите $array или $string, который никогда не будет определен, поэтому, когда что-то пытается сослаться на него, ваша программа делает плохие вещи.

$var1 = array();
foreach($var1 as $key => $val) {
    $array[] = $key;
}
foreach($array as $v) { // errors because $array isn't defined
...
}
2 голосов
/ 08 декабря 2011

Для одного, не инициализация массива выдаст предупреждение. Ваш код не должен этого делать.

Кроме того, что произойдет, если у вас случайно будет существующий массив с тем же именем в области видимости? Это может привести к трудным отслеживанию ошибок.

Во втором примере я бы инициализировал строку как пустую строку (''), а не null.

1 голос
/ 08 декабря 2011

Эти блоки кода будут выдавать предупреждения.

$string .= "asdf";

Это просто сокращение для

$string = $string . $asdf

Так как он не определен справа, это выдаст уведомление Undefined variable: string. Вы получите аналогичное уведомление за попытку добавить элементы в неопределенный массив varaible.

Инициализация переменных к значениям по умолчанию также облегчает чтение кода (большая часть того, что делают программисты, фактически читает код, а не пишет код). Когда вы видите задание $string = '', вам нужно помнить об этом. Это упрощает следование коду, если вы не извлекаете переменные из воздуха.

Наконец, хорошо отметить, что php - один из немногих широко используемых языков, где вы можете делать что-то подобное (он просто выдает предупреждения, а не ошибки). На большинстве языков это просто приведет к ошибке и вообще не будет работать.

0 голосов
/ 08 декабря 2011

Поскольку использование неинициализированных переменных в PHP считается чем-то странным, и это приведет к ошибкам на уровне уведомлений и предупреждений, чтобы попытаться привлечь ваше внимание к этим вещам.

Конечно, вы можете отключить отчеты об ошибкахэтот уровень или сообщать обо всех ошибках.Но с отключенными уведомлениями и предупреждениями вы можете пропустить, когда что-то действительно странное начнет происходить, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...