変数のスコープ
CoddyのPHPジャーニー「基礎」セクションの一部。レッスン 67/71。
関数内で作成された変数は、その外部にある変数とは完全に別のものです。この概念は variable スコープ と呼ばれ、これを理解することで、コード内の紛らわしいバグを防げます。
variable は function 内で定義されると、その function 内でのみ存在します。これは local variable と呼ばれます:
<?php
function sayHi() {
$message = "Hello!";
echo $message;
}
sayHi();
echo $message; // エラー: $message はここでは存在しません
?>変数 $message は sayHi() の内部で作成され、function が終了すると消えます。外部からアクセスしようとするとエラーが発生します。
同様に、関数の外で定義された変数は、関数内で自動的に利用できるわけではありません。
<?php
$name = "Alice";
function greet() {
echo $name; // エラー: $name はこの関数内で定義されていません
}
greet();
?>メインコードに$nameが存在していても、関数からはそれを参照できません。関数内で外部の値を使うには、それらをパラメーターとして渡します。これは、すでに学んだ、クリーンで推奨されるアプローチです。
この分離は実際に役立ちます。これにより、function がプログラムの他の部分にある変数を誤って変更することがなくなり、コードの予測可能性が高まり、デバッグしやすくなります。
チャレンジ
簡単入力を2行読み取ります:
- 人の名前(例:
Alice) - 整数のボーナス額(例:
50)
calculateBonusという名前の関数を作成します。この関数は2つのパラメータ、$name(string)と$bonus(int)を受け取ります。
関数の内部で:
- ローカル変数
$baseSalaryを作成し、1000を設定します $baseSalaryと$bonusを加算して合計の給与を計算します- 次の形式の文字列を返します:
[name] earns [total]
入力値を使って関数を呼び出し、返された結果を出力します。
例1:
入力がAliceと50の場合、出力は次のようになります:
Alice earns 1050例2:
入力がBobと200の場合、出力は次のようになります:
Bob earns 1200例3:
入力がEmmaと0の場合、出力は次のようになります:
Emma earns 1000自分で試してみよう
<?php
// 入力を読み取る
$name = trim(fgets(STDIN));
$bonus = intval(fgets(STDIN));
// TODO: 以下に calculateBonus 関数を作成する
// - $name (string) と $bonus (int) をパラメータとして受け取る必要がある
// - ローカル変数 $baseSalary を作成し 1000 に設定する
// - 合計給与を計算し "[name] earns [total]" を返す
// 関数を呼び出して結果を出力する
echo calculateBonus($name, $bonus);
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ