【PHP】Lesson3-7:スコープを理解しよう

ながみえ

一つ前のレッスンでは 無名関数とアロー関数 について学習しました。

今回は スコープ について見ていきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数編

 ・Lesson3-1:組み込み関数を理解しよう
 ・Lesson3-2:関数の基本を理解しよう
 ・Lesson3-3:関数の戻り値を理解しよう
 ・Lesson3-4:デフォルト引数とキーワード引数を理解しよう
 ・Lesson3-5:関数の型付けを理解しよう
 ・Lesson3-6:無名関数とアロー関数を理解しよう
 ・Lesson3-7:スコープを理解しよう ◁今回はココ
 ・確認問題3-1:石取りゲームを作ろう
 ・確認問題3-2:丁半賭博ゲームを作ろう
 ・確認問題3-3:モンスターとのバトルゲームを作ろう
Lesson4:データ構造編
Lesson5:クラス

<<前のページ

学習記事一覧

次のページ>>

スコープ

PHPでプログラムを書くうえで「スコープ(有効範囲)」の仕組みを理解することはとても重要です。

スコープとは、変数や関数などが「どこからどこまで使えるのか」という範囲のことを指し、主にローカルスコープ(関数内で有効)とグローバルスコープ(全体で有効)の違いがあります。

スコープを正しく理解すれば、「予期せぬ変数の上書き」や「関数内で変数が使えない」といったエラーを防ぐことができ、コードのトラブルを減らすことができます。

また、static変数の使い方も知ることで、より効率的なプログラムを書く力が身につきます。

これからスコープの基本や具体的な使い方を分かりやすく解説していきますので、ぜひ本文を読み進めて、PHPを安全かつスマートに使いこなせる力を身につけましょう!

ローカルスコープとグローバルスコープ|変数の有効範囲を理解しよう

スコープ とは、変数や関数などが「どこからどこまで使えるのか」という範囲を表す言葉です。

PHPには主に以下の2種類のスコープがあります:

  1. ローカルスコープ
    • 関数の中で宣言された変数が、その関数の中だけで使える範囲のこと。
    • 関数の外からはその変数にアクセスできない。
  2. グローバルスコープ
    • 関数の外側(つまりスクリプト全体)で宣言された変数が、どこで使えるかという範囲のこと。
    • ただし、関数内からグローバル変数にアクセスするには globalキーワード を使用する必要がある。

関数内と関数外に同じ名前の変数がある場合、関数内で使用する際はローカル変数が優先されます。

ローカル変数とは何か?|関数内での使い方と有効範囲

ローカル変数とは、関数内で定義された変数、すなわちローカルスコープが適用される変数のことです。

function exampleLocalScope() {			// 関数の定義
    $localVar = "私はローカル変数です";  // ローカル変数の宣言
    echo $localVar . PHP_EOL;			// 関数内なのでローカル変数を使用可能
}

echo $localVar . PHP_EOL;	// エラー:ローカル変数は関数外では無効
exampleLocalScope();		// 関数を呼び出して使用することは問題ない
  • $localVarは関数内でのみ宣言・有効な「ローカル変数」です。
  • 関数外でアクセスしようとするとエラーになります。

グローバル変数とは何か?|関数外の変数の扱いを理解しよう

グローバルローカル変数とは、関数の外で定義された変数、すなわちグローバルスコープが適用される変数のことです。

関数内からグローバル変数を使用するには globalキーワード を使用します。

$globalVar = "私はグローバル変数です";	   // グローバル変数の宣言
echo $globalVar . PHP_EOL;				// グローバル変数は関数外でも有効

function exampleGlobalScope() {			// 関数の定義
    global $globalVar;					// グローバル変数を関数内で使用
    echo $globalVar . PHP_EOL;
}

exampleGlobalScope();
  • $globalVarは関数外で宣言された「グローバル変数」です。
  • globalキーワードを使うことで、関数内からもアクセスできます。

静的変数とは何か?|普通のローカル変数との違いと使い方

静的変数(staticとは、関数が呼び出されても値が保持され続けるローカル変数です。

普通のローカル変数は関数が終わると消えますが、静的変数は次回も前回の値が使えます。

静的変数を定義するには staticキーワード を使用します。

function counter() {
    static $count = 0;	// 静的変数の宣言
    $count++;
    echo "呼び出し回数: " . $count . PHP_EOL;
}

counter(); // 呼び出し回数: 1
counter(); // 呼び出し回数: 2
counter(); // 呼び出し回数: 3

このコードを実行すると以下のように出力されます。

呼び出し回数: 1
呼び出し回数: 2
呼び出し回数: 3

まとめ|変数の有効範囲を理解して安全なコードを目指そう

この記事では、PHPのスコープについて、ローカルスコープとグローバルスコープの違いや、それぞれの変数の有効範囲、さらに静的変数(static変数)の特徴まで詳しく解説しました。

この内容を理解することで、変数の意図しない上書きや予期せぬ動作を防ぎ、より安全でバグの少ないコードを書く力が身につきます。

また、適切にスコープを使い分けることで、関数やプログラム全体の設計力も大きく向上します。

引き続き、PHPの基礎を一つひとつ丁寧に積み重ねて、実践力のあるプログラマーを目指しましょう!

演習問題|スコープを体験しよう|グローバル変数とローカル変数の使い方

PHPの「スコープ」を理解するために、関数内外で宣言される変数がどのように動作するかを確認しましょう。

このプログラムではローカル変数グローバル変数を使い、関数の内側と外側で変数のアクセスを試します。

この演習の要件

以下の要件に従ってコードを完成させてください。

  1. グローバル変数 $globalVar に「これはグローバル変数です」という文字列を格納し、関数外で表示すること。
  2. 関数 scopeExample() を定義し、以下の処理を行うこと:
    • ローカル変数 $localVar を宣言し「これはローカル変数です」という文字列を代入し、関数内で表示すること。
    • global キーワードを使用して関数内から $globalVar にアクセスし、表示すること。
  3. 関数 scopeExample() を呼び出し、関数内の表示結果を確認すること。
  4. 関数外で $globalVar を再び表示すること。
  5. 関数外で $localVar を表示しようとした場合にエラーが発生することを確認すること(コメントアウトしておく)。

ただし、以下のような実行結果となること。

関数内のローカル変数: これはローカル変数です
関数内のグローバル変数: これはグローバル変数です
関数外のグローバル変数: これはグローバル変数です
関数外のローカル変数にアクセスするとエラーになります:

解き方のヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:PHPスクリプトの開始を宣言
2:グローバル変数$globalVarに「これはグローバル変数です」を代入
3:関数scopeExampleの定義
  □ ローカル変数$localVarに「これはローカル変数です」を代入
  □ 「関数内のローカル変数: 」と$localVarの内容を出力
  □ globalキーワードを使用してグローバル変数$globalVarにアクセス
  □ 「関数内のグローバル変数: 」と$globalVarの内容を出力
4:関数scopeExampleを呼び出し
5:「関数外のグローバル変数: 」とグローバル変数$globalVarの内容を出力
6:「関数外のローカル変数にアクセスするとエラーになります: 」を出力
7:コメントで関数外でローカル変数$localVarにアクセスするとエラーが発生することを示す(実際のコードではエラー回避のためコメントアウト)

Q
ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

<?php

/* 【穴埋め問題1】
ここでグローバル変数を宣言し、値「これはグローバル変数です」を代入するコードを書いてください。
*/

// 関数の定義:ローカルスコープの例とグローバル変数の使用
function scopeExample() {
    /* 【穴埋め問題2】
    ここでローカル変数を宣言し、「これはローカル変数です」を代入するコードを書いてください。
    */

    /* 【穴埋め問題3】
    ここでローカル変数の値を「関数内のローカル変数: 」と一緒に出力するコードを書いてください。
    */

    /* 【穴埋め問題4】
    globalキーワードを使ってグローバル変数にアクセスし、「関数内のグローバル変数: 」と一緒に値を出力するコードを書いてください。
    */
}

// 関数の呼び出し
/* 【穴埋め問題5】
ここで関数`scopeExample`を呼び出すコードを書いてください。
*/

// グローバル変数は関数外でも使用できる
/* 【穴埋め問題6】
ここでグローバル変数の値を「関数外のグローバル変数: 」と一緒に出力するコードを書いてください。
*/

// 以下はエラーの例:関数外でローカル変数にアクセスしようとする
echo "関数外のローカル変数にアクセスするとエラーになります: " . PHP_EOL;
// echo $localVar; // コメントを外すとエラーが発生します

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

演習問題の答え合わせ

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
<?php

// グローバル変数の宣言
$globalVar = "これはグローバル変数です";

// 関数の定義:ローカルスコープの例とグローバル変数の使用
function scopeExample() {
    // 関数内でローカル変数を宣言
    $localVar = "これはローカル変数です";

    // ローカル変数の表示
    echo "関数内のローカル変数: " . $localVar . PHP_EOL;

    // グローバル変数にアクセスするために 'global' キーワードを使用
    global $globalVar;
    echo "関数内のグローバル変数: " . $globalVar . PHP_EOL;
}

// 関数の呼び出し
scopeExample();

// グローバル変数は関数外でも使用できる
echo "関数外のグローバル変数: " . $globalVar . PHP_EOL;

// 以下はエラーの例:関数外でローカル変数にアクセスしようとする
echo "関数外のローカル変数にアクセスするとエラーになります: " . PHP_EOL;
// echo $localVar; // コメントを外すとエラーが発生します
Q
正解コードの解説

コードをブロックごとに分割して解説します。

グローバル変数の宣言

$globalVar = "これはグローバル変数です";
  • $globalVarグローバルスコープで宣言された変数です。
  • グローバルスコープとは、関数の外で宣言され、プログラム全体でアクセス可能な変数のことです。
  • ただし、関数内でこの変数にアクセスするにはglobalキーワードが必要です。

関数の定義とローカルスコープの使用

function scopeExample() {
    // ローカル変数の宣言
    $localVar = "これはローカル変数です";
    echo "関数内のローカル変数: " . $localVar . PHP_EOL;

    // グローバル変数にアクセス
    global $globalVar;
    echo "関数内のグローバル変数: " . $globalVar . PHP_EOL;
}
  1. 関数scopeExampleの中では2種類の変数が登場します:
    • ローカル変数 $localVar:関数内でのみ有効です。関数外からアクセスするとエラーになります。
    • グローバル変数 $globalVar:関数内からアクセスするにはglobalキーワードを使います。
  2. globalを使わないと関数内でグローバル変数にアクセスできません。

関数の呼び出し

scopeExample();
  • scopeExample() を呼び出すことで、関数内の処理が実行されます。
  • この関数ではローカル変数とグローバル変数の値が表示されます。

関数外でのグローバル変数の表示

echo "関数外のグローバル変数: " . $globalVar . PHP_EOL;
  • $globalVarはグローバルスコープで宣言されているため、関数の外でもアクセス可能です。
  • グローバルスコープの変数は関数に依存せずいつでも参照できます。

ローカル変数へのアクセス禁止

// echo $localVar; // エラー:ローカル変数は関数外では使えません
  • 関数内で宣言されたローカル変数 $localVar は、関数外ではアクセスできません。
  • コメントアウトを解除するとエラーが発生します。これがローカルスコープの特徴です。
もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいPHP学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました