プログラミング PHP

【PHP入門】ローカル変数とグローバル変数

本記事では、変数のスコープ(ローカル変数、グローバル変数)について紹介します。

変数のスコープとは

変数のスコープとは、定義した変数が使える範囲のことをいいます。

ローカル変数とは

ローカル変数とは、関数内で定義した変数のことです。

ローカル変数のスコープは変数を宣言した関数内です。そのため、ローカル変数を定義した関数内でしか使用することができません。
※ローカル変数を関数の外で使用するとエラーが発生します。

[ローカル変数の使用例]

<?php
 function test( ) {
  $a = 1;
  print ("ローカル変数aの値:".$a);
 }
 test( );
?>

[実行結果]

ローカル変数aの値:1

グローバル変数とは

グローバル変数とは、関数の外で定義した変数や、関数内でglobalをつけて定義した変数のことです。

グローバル変数のスコープはPHPスクリプト全体です。
関数内でしか使えないローカル変数とは違い、グローバル変数は関数内外に関わらず使用することができます。

グローバル変数を関数内で使用するときは「global」の宣言を行います。

[global宣言なしの場合]

<?php
 $a = 0;
 function test( ) {
  $a = 0;
  $a++;
  print ("関数内の変数aの値:" .$a."<br>");
 }
 test();
 print ("関数外の変数aの値:".$a);
?>

[実行結果]

関数内の変数aの値:1
関数外の変数aの値:0

関数外で定義した「$a」と関数内で定義した「$a」は同じ変数名ですが、関数外で定義した「$a」はグローバル変数、関数内で定義した「$a」はローカル変数と判断されて、別の変数として扱われます。

そのため、関数内でグローバル変数を使用するときは「global」の宣言(グローバル変数として扱う)が必要となります。

[global宣言ありの場合]

<?php
 $a = 0;
 function test( ) {
  global $a;
  $a++;
  print ("[関数内]グローバル変数aの値:".$GLOBALS["a"]."<br>";
 }
 test( );
 print ("[関数外]グローバル変数aの値:".$a);
?>

[実行結果]

[関数内]グローバル変数aの値:1
[関数外]グローバル変数aの値:1

global宣言をすることで、関数外で定義したグローバル変数を関数内で参照することができました。

関数内では「global宣言あり:グローバル変数」「global宣言なし:ローカル変数」として扱います。

スーパーグローバル変数「$GLOBALS」

グローバル変数は、スーパーグローバル変数の「$GLOBALS」を使って表現することもできます。

書き方が違うだけで、globalと同じ意味です。

[$GLOBALSの例]

<?php
 $a = 0;
 function test( ) {
  $GLOBALS['a']++;
  print ("[関数内]グローバル変数aの値:".$GLOBALS['a']."<br/>");
 }
 test( );
 print ("[関数外]グローバル変数aの値:".$a);
?>

[実行結果]

[関数内]グローバル変数aの値:1
[関数外]グローバル変数aの値:1

静的(static)変数とは

ローカル変数にstaticをつけると、静的(static)変数に変わります。
ローカル変数と静的変数の違いは、関数の呼び出しごとに値が残るかどうかです。

静的変数の初期化は最初の1回のみ行われて、関数の処理が終わってもその値を失いません

[ローカル変数と静的変数の例]

<?php
 function test( ) {
  $a = 0;
  static $b = 0;
  $a++;
  $b++;
  print ("ローカル変数aの値=".$a." 静的変数bの値=".$b."<br>");
 }
 test( );
 test( );
?>

[実行結果]

ローカル変数aの値=1 静的変数bの値=1
ローカル変数aの値=1 静的変数bの値=2

ローカル変数は、関数の処理が終わったらその値を失います。そのため「test()」をコールするたびにローカル変数「$a」が作られます。
※実行結果のとおり、常に値は1になります。

それに比べ 静的変数は、関数の処理が終わってもその値を失いません。そのため「test()」を初回にコールしたときに静的変数「$b」の初期化が行われ、2回目以降「test()」をコールしたときは、初期化処理は行われず既に作成されている静的変数「$b」を使用します。
※実行結果のとおり、値は増えていきます。

ローカル変数は、関数をコールするたびに新しく作られ(関数の処理が終わると失います)、静的変数は1度作られたらその値は残り続ける変数です。

ローカル変数、グローバル変数、静的変数について紹介しました。PHPの学習をされている方のお力になれれば幸いです。

学習書の紹介

-プログラミング, PHP