【PHP】スコープ - 変数の有効範囲

【PHP】スコープ - 変数の有効範囲

変数には、その変数が利用可能な有効範囲があります。

その有効範囲をスコープと呼び、意図したプログラムを作成するためには必要な知識です。

ここでは、スコープについて解説します。

検証環境

スコープ

スコープは“変数の有効範囲”です。

PHPの変数は宣言された場所・方法によってローカルスコープ、グローバルスコープ、スーパーグローバルスコープのいずれかのスコープ(有効範囲)を持ちます。

ローカルスコープ

ローカルスコープは“ブロック(波括弧{})内を対象範囲としたスコープ”です。

関数やメソッドなどのブロック内で宣言した変数はローカルスコープになり、異なるスコープであれば、同じ変数名でも別の変数として扱われます。

<?php

function sample1() {
    ___ih_hl_start
    $message = 'Hello World!';
    ___ih_hl_end
    echo $message."\n";
}

function sample2() {
    ___ih_hl_start
    $message = 'Good Morning!';
    ___ih_hl_end
    echo $message."\n";
}

sample1();
sample2();

?>
$ php sample1.php
Hello World!
Good Morning!

4、9行目の$messageは各関数のブロックを対象にしたローカルスコープの変数です。

関数ごとの変数になるため、sample1関数とsample2関数は互いの$messageに影響を及ぼしません

また、ローカルスコープの変数はブロック外からアクセスすると有効範囲外のため、エラーが発生します。

<?php

function sample() {
    $message = 'Hello World!';
    echo $message."\n";
}

echo $message."\n";

?>
$ php sample2.php
PHP Warning:  Undefined variable $message in sample.php on line 8

Warning: Undefined variable $message in sample.php on line 8

グローバルスコープ

グローバルスコープは“ブロック(波括弧{})外を対象範囲としたスコープ”です。

ブロック外で宣言した変数はグローバルスコープになり、ブロック外で使用できる他、globalキーワードを使って関数などのブロック内で使うことが可能です。

例えば、次の$messageはグローバルスコープです。

<?php

___ih_hl_start
$message = 'Hello World!';
___ih_hl_end

echo $message."\n";

?>
$ php sample3.php
Hello World!

グローバルスコープの変数を関数のブロック内で使用する場合、globalキーワードを使って、その変数を使うことを宣言します。

<?php

$message = 'Hello World!';

function sample() {
    ___ih_hl_start
    global $message;
    ___ih_hl_end
    echo $message."\n";
}

sample();

?>
$ php sample4.php
Hello World!

globalキーワードを使った宣言がない場合、関数の処理で変数が見つからず、エラーが発生しますので注意してください。

<?php

$message = 'Hello World!';

function sample() {
    ___ih_diff_start
-    global $message;
    ___ih_diff_end
    echo $message."\n";
}

sample();

?>
$ php sample5.php
PHP Warning:  Undefined variable $message in sample.php on line 6

Warning: Undefined variable $message in sample.php on line 6

スーパーグローバルスコープ

スーパーグローバルスコープは“PHPがあらかじめ定義した変数の対象範囲のスコープ”です。

PHPがあらかじめ定義した変数はスーパーグローバルスコープになり、次のような変数があります。

  • $GLOBALS
  • $_SERVER
  • $_GET
  • $_POST
  • $_FILES
  • $_COOKIE
  • $_SESSION
  • $_REQUEST
  • $_ENV

スーパーグローバルスコープの変数はプログラムのどこでも使うことができます。

それぞれの変数については割愛しますが、ここでは、そのようなスコープがあることを覚えておきましょう。

注意点

PHPのスコープについて2つの注意点があります。

globalの使用

変数はスコープによって、その変数の影響範囲を制限します。

その制限はプログラム構造をシンプルにするための重要な役割を担いますが、globalキーワードは影響範囲を変えてしまうため、時にプログラムを複雑化してしまいます。

そのため、関数のブロック内などでグローバルスコープの変数を使いたい場合は、可能な限り引数でその値のみを与えるようにしましょう。

他言語との比較

他の言語ではif文やfor文などのブロック内の変数は、そのブロック外では使えないことがあります。

しかし、PHPでは使えてしまい、これはプログラムの安定性や可読性低下を招いてしまいます。

そのため、可能な限り変数は宣言したブロック外で使わないようにしましょう。