2011-12-08 18 views
2

私は変数を初期化することの重要性を理解しようとしています。たとえば、ループ内に配列を作成しているような稀なケースで、変数に値を割り当てる前に、変数の初期化の重要性は?

たとえば、この例では

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

私が言われてきた配列を含むように使用される前、$arrayが宣言されていない悪い習慣ですが、私は、なぜ分かりません。私は代わりにこれを行うように勧められました。

$array = array(); 

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

別の例として、多くの配列の値に基づいて、長い文字列を構築する場合:私はそれがこの

$string = null; 

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

のように行われるべきであると言われてきた

$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; 
} 

それとも$content_index$src_index$alt_indexような変数の前にglobalキーワードを使用する方が賢明であり、必要となるすべての変数を含むことになり、すなわちinit_variables.phpを含まれることになる別のファイルにそれらを初期化しますこのポストの例のように、使用前に初期化する必要がありますか?

+1

関数内でのみ使用される変数は、「グローバル」ではありません。 – Amber

+0

ありがとうございます。私は例のように関数内でそれらを初期化します:) – Avicinnian

答えて

4

ループオーバーしているものが空の配列の場合はどうなりますか? $arrayまたは$stringが決して定義されていないので、何かを参照しようとすると、あなたのプログラムは悪いことをします。

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

実用的な反例のために+1 ... –

+0

私はあなたが言っていることを見ています。例のための小道具:)! – Avicinnian

2

1つは、アレイを初期化しないと警告が表示されます。あなたのコードはそれを行うべきではありません。

また、誤ってスコープ内に同じ名前の既存の配列があった場合はどうなりますか?これにより、バグを追跡することが困難になる可能性があります。

2番目の例では、文字列をnullではなく空の文字列('')として初期化します。

+0

チップありがとう)。 – Avicinnian

+0

関数内に変数が含まれている場合の適切な初期化メソッドに関して、私が作ったクイックアップデートを見てみることはできないでしょうか? – Avicinnian

+0

本当に必要な場合以外は、 'global'を使わないでください。 – Amber

1

これらのコードブロックは警告を発します。それが右手に定義されていないので

$string .= "asdf"; 

$string = $string . $asdf 

のためだけの省略形です、これは予告Undefined variable: stringを与えるだろう。定義されていない配列に要素を追加しようとすると同様の通知が表示されます。

変数をデフォルト値に初期化すると、コードを読みやすくなります(プログラマが実際に行うことは、コードを書くのではなくコードを読むことがほとんどです)。あなたが割り当て$string = ''を見るとき、あなたはそれを念頭に置いておくと言います。変数を細い空気から引き出さないと、コードを簡単に追うことができます。

最後に、phpは、このような何かをすることができます(警告ではなく、エラーではありません)。ほとんどの言語では、エラーが発生し、まったく実行されません。

+0

ブリリアント。清潔で徹底した説明をありがとう! – Avicinnian

0

初期化されていない変数を使用すると、PHPで何か奇妙なものとみなされ、通知と警告レベルのエラーが発生し、このことに注意を払うことになります。

もちろん、このレベルのレポートエラーをオフにしたり、すべてのエラーを報告したりすることができます。しかし、通知や警告を消してしまえば、本当に不思議なことが起き始めるのを忘れることがあります。