fizzbuzz問題 備忘録


<?php
    $max = 100;
    for ( $i = 1; $i <= $max; $i++ ){
        print fizzbuzz($i) . PHP_EOL;
    }
    function FizzBuzz ($i) {
            if ( ($i % 3 == 0) && ( $i % 5 == 0) ){
            return 'FizzBuzz';
            }
            elseif ($i % 3 == 0){
            return 'Fizz';
            }
            elseif ($i % 5 == 0){
            return 'Buzz';
            }
            else {
            return $i;
            }
    }
?>

スコープの認識不足でエラー発生↓

<?php
    $max = 100;
    function FizzBuzz ($i){
        for ( $i = 1; $i <= $max; $i++ ){
            if ( ($i % 3 == 0) && ( $i % 5 == 0) ){
            return 'FizzBuzz';
            }
            elseif ($i % 3 == 0){
            return 'Fizz';
            }
            elseif ($i % 5 == 0){
            return 'Buzz';
            }
            else {
            return $i;
            }

        }
    }

 print FizzBuzz ($i) . PHP_EOL; 
?>

エラーメモ

  • 理由:関数内外における、変数のスコープ(有効範囲)の理解不足
    • $maxは関数外で定義されている変数なので、関数内($i <= $max;)では参照されない。
    • $iは関数内で定義されている変数なので、関数外(print FizzBuzz ($i) . PHP_EOL; )では参照されない。
  • 有効範囲(スコープ)について
    • 変数には有効範囲(スコープ)があるため、範囲が異なると参照することができない。
      • グローバル変数・・・関数外で定義していた変数、プログラムのどこからでも参照可能
      • ローカル変数・・・関数内などで定義されている、有効範囲が限られた変数
    • 関数内で参照できる変数は、関数内で定義された変数のみ。関数外で定義した変数を使おうとしても参照することはできない。
    • 逆に関数内で定義された変数を関数外で使うこともできない。
  • global宣言することで、関数内でローカルではなくグローバル変数を参照するようになる。ただしあまり使わないほうが良い。

参考
ゼロから始めるPHP講座Vol.40 ユーザー定義関数①