<?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宣言することで、関数内でローカルではなくグローバル変数を参照するようになる。ただしあまり使わないほうが良い。