Into the Program

【PHP】変数のスコープ

Image

関数を使用する上で変数のスコープについて触れておきたいと思います。

変数のスコープとは

PHPの変数には予め有効範囲が決められています。

関数を定義する際、実際に試してみた方もいるかもしれないですが、関数の中に定義した変数に関数の外から値を代入したり、参照することはできないようになっています。これは、定義した変数に有効範囲が定められていて、関数の中の変数が操作できるのは変数が定義された関数からのみとなっているからです。

この変数が操作できる有効範囲ことを変数のスコープと言います。

例えば、以下のようなコードがあったとします。

<?php

$name = "yourname";
print_name();

function print_name(){

    echo $name;

}

?>

上記コードを実行した場合、何も出力されません。それは変数のスコープが以下のようになっているからです。

<?php

// グローバルスコープの変数
$name = "yourname";
print_name();

function print_name(){

  // ローカルスコープの変数
  echo $name;

}

?>

関数内でechoした変数はローカルスコープの変数を参照しています。しかし、ローカルスコープの変数には値が代入されていないため出力する値がありません。そのため何も出力せずに処理を終えます。

デフォルトでは関数内からグローバルスコープの変数を操作することができません。しかし、方法は用意してあります。グローバル宣言というものを行い、グローバルスコープの変数にアクセスすることができます。

グローバル宣言

関数の処理の中で関数外の変数を参照するにはグローバル宣言というものを使います。

グローバル宣言とは、関数内で操作したい関数外の変数の前にglobalを記述するものです。以下のように指定します。

<?php

$name = "yourname";
print_name();

function print_name(){

  global $name;
  echo "ようこそ".$name."さん";

}

?>

グローバル宣言によって、関数外の変数の値が関数内で使用できたかと思います。ちなみにグローバル宣言を行うと、関数の中でグローバルスコープの変数に値を代入することができます。

以下のようにします。

<?php

$name = "yourname";
print_name();

function print_name(){

  global $name;
  $name = "yourname2"
  echo "ようこそ".$name."さん";

}

?>

注意点として、関数の中でグローバル宣言を行なった変数に値を代入すると、元の変数の値が上書きされます。上記例の場合、変数$nameに最後に格納されている値はyourname2となります。

グローバル宣言は変数を扱う上で大変便利な機能ですが、一つの変数を複数の処理で使用するということになりますので、扱いには注意が必要です。実装する段階でグローバルで変数を管理する必要があるのか熟考した上で使用するように心がけましょう。

GLOBALS

グローバル宣言とは別にグローバルスコープの変数にアクセスする方法として配列の$GLOBALSをご紹介します。

$GLOBALSは連想配列です。定義した全ての変数を格納しており、変数名をキー、変数の値が配列の内容となっています。

関数の中で呼び出す場合は以下のように記述します。

function 関数名(){

  $GLOBALS['変数名'];

}

以下サンプルです。

<?php

$name = "yourname";
print_name();

function print_name(){

  echo "ようこそ".$GLOBALS['name']."さん";

}

?>

グローバル宣言と同様、値を代入することも可能です。

<?php

$name = "yourname";
print_name();

function print_name(){

  $GLOBALS['name'] = "yourname2";
  echo "ようこそ".$GLOBALS['name']."さん";

}

?>

連想配列の$GLOBALSはどこからでも利用することができるため、スーパーグローバルと呼ばれています。

PHPにはスーパーグローバルと呼ばれる変数が何種類か用意してありますので、今後、順番にご紹介していきたいと思います。

staticで静的な変数を使用する

変数のスコープの最後に、staticをご紹介します。staticという語句は「静的」という意味を含んでいます。静的を辞書で引くと、静かで動かない様、と書いてあります。

通常であれば、関数内で定義した変数は関数が呼び出された時点で初期化されますが、変数をstaticにすることによって、同じ関数を複数回呼び出した場合でも値を保持したまま処理を行うことができます。静的な変数の特徴は、関数内の処理が終了した後も値を保持し続けてくれるところにあります。

サンプルとして関数が呼び出されるたびにカウントアップするプログラムを書いてみます。

<?php

counter();
counter();
counter();
counter();
counter();

function counter(){

  static $num = 0;
  echo $num++."<br />";

}

?>

staticを付加することで、関数が最初に呼び出された時に初期化処理を行い、以降は$numの値が増加してくれます。staticの変数は関数の処理が終わった後も値を保持し続けると覚えておいてもらえればと思います。

SHARE