【PHP】レッスン3-07:スコープを理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:スコープ

この記事の練習問題を解くために必要な知識:
ビルトイン関数関数の定義と呼出し関数の戻り値デフォルト引数とキーワード引数関数の型付け無名関数とアロー関数スコープ

<<前のページ PHP記事一覧 次のページ>>

PHPの「スコープ」とは

この章ではPHPにおける「スコープ」の意味や使い方を学習します。用語の解説が不要な方はここをクリックして練習問題へ飛びましょう。




「スコープ」とは、変数や関数が有効な範囲を指します。

PHPでは変数がどこで宣言され、どこで使用できるのかを「スコープ」という概念で管理します。

スコープを理解することで、予期しないエラーや不具合を防ぐことができます。

PHPのスコープの概要

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

  1. ローカルスコープ
    • 関数内で宣言された変数はその関数内(ローカル)でのみ有効です。
    • 関数の外からはその変数にアクセスすることはできません。
  2. グローバルスコープ
    • 関数の外で宣言された変数は、関数の外部(グローバル)で有効です。
    • ただし、関数内からグローバル変数にアクセスするにはglobalキーワードを使用する必要があります。

ローカルスコープの例

function exampleLocalScope() {
    $localVar = "私はローカル変数です";
    echo $localVar . PHP_EOL;
}

exampleLocalScope();
// echo $localVar; // エラー!$localVarは関数外では無効です。
  • $localVarは関数内でのみ宣言・有効な「ローカル変数」です。
  • 関数外でアクセスしようとするとエラーになります。

グローバルスコープの例

$globalVar = "私はグローバル変数です";

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

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

ローカルスコープとグローバルスコープの違い

$globalVar = "グローバル変数";

function scopeExample() {
    $localVar = "ローカル変数";
    echo "関数内でのローカル変数: " . $localVar . PHP_EOL;

    global $globalVar; // グローバル変数を使う
    echo "関数内でのグローバル変数: " . $globalVar . PHP_EOL;
}

scopeExample();

echo "関数外でのグローバル変数: " . $globalVar . PHP_EOL;
// echo $localVar; // エラー!ローカル変数は関数外では無効です。

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

関数内でのローカル変数: ローカル変数
関数内でのグローバル変数: グローバル変数
関数外でのグローバル変数: グローバル変数

スコープの注意点

  1. ローカル変数の優先度
    • 関数内に同じ名前の変数がある場合、ローカル変数が優先されます。
  2. globalキーワードの使用
    • globalを使うことで関数内からグローバル変数にアクセスできますが、多用するとコードの可読性が低下します。
  3. 静的変数(static)
    • 関数内の変数を関数終了後も保持するには、staticキーワードを使います。

静的変数の例:

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

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

まとめ

スコープは変数や関数がどこで有効かを決める重要なルールです。

  • ローカルスコープ:関数内の変数は外部で使えない。
  • グローバルスコープ:関数外の変数はグローバルで使えるが、関数内で使うにはglobalが必要。

またstaticキーワードを使うことで変数の値を関数間で保持することもできます。

スコープを正しく理解し、効率的なコードを書けるようにしましょう!

スコープの練習問題:グローバル変数とローカル変数を使い分けよう

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

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

この問題の要件

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

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

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

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

この問題を解くヒント

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

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

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

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

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

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

<?php

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

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

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

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

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

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

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

以上がこの問題の穴埋めコードです。

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



練習問題の解答と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

<?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; // コメントを外すとエラーが発生します

正解コードの解説

このコードはPHPの「スコープ」という概念を理解するためのものです。

それではコードをブロックごとに解説していきましょう。

グローバル変数の宣言

$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 は、関数外ではアクセスできません。
  • コメントアウトを解除するとエラーが発生します。これがローカルスコープの特徴です。

まとめ

このコードではスコープの基本を学びました。

  • ローカルスコープ:関数内で宣言された変数は関数外からアクセスできません。
  • グローバルスコープ:関数外で宣言された変数はプログラム全体で使えますが、関数内でアクセスする場合はglobalを使います。

スコープを理解することで変数が意図しない場所で変更されることを防ぎ、コードを安全かつ分かりやすく書くことができます。

今回の学習を活かし、他のプログラムでも変数のスコープを意識して書いてみましょう!

<<前のページ PHP記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    PHPのテキスト&問題集トップへ戻る
    トップページへ戻る