PHP - 変数のスコープ

変数のスコープ

変数のスコープは、その変数が定義されたコンテキストです。このスコープの範囲は、includerequire により読みこまれたファイルも含まれます。以下の例では、変数 $a はインクルードされた b.inc スクリプトの中でも利用可能です。

<?php
  $a = 1;
  include 'b.inc';
?>
変数のスコープ

しかし、ユーザ定義の関数の中では変数の有効範囲はローカル関数の中となります。関数の中で使用された変数はデフォルトで有効範囲が関数内部に制限されます。

<?php
  /* グローバルスコープ */
  $a = 1;

  function test(){ 
    /* ローカルスコープ */ 
    echo $a;
  }

  test(); // ""
?>
グローバルスコープとローカルスコープ

上記のスクリプトは、出力を行いません。これは、echo 命令がローカルスコープの $a 変数を参照しているにもかかわらず、このスコープでは値が代入されていないからです。グローバル変数を関数の内部で使用する場合、関数の内部でグローバルとして宣言する必要があります。

<?php
  $a = 1;
  $b = 2;

  function Sum(){
      global $a, $b;
      $b = $a + $b;
  } 

  Sum();
  echo $b; // 3
?>
global の使用

上記のスクリプトでは、関数の内部で $a, $b をグローバル宣言を行うことにより、両変数への参照はグローバル変数の方を参照することになります。また、PHP が定義する配列 $GLOBALS を使用することで、次のように書き換えることができます。

<?php
  $a = 1;
  $b = 2;

  function Sum(){
      $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
  } 

  Sum();
  echo $b; // 3
?>
global の使用

配列 $GLOBALS は連想配列であり、グローバル変数の名前がキー、その変数の内容が配列要素の値となっています。$GLOBALSスーパーグローバルであるため、$GLOBALS はすべてのスコープに存在します。

変数のスコープに関する別の重要な機能は、静的 (static) 変数です。静的変数はローカル関数スコープのみに存在しますが、プログラム実行がこのスコープの外で行われるようになってもその値を失わないません。以下のスクリプトでは $a は関数が最初にコールされたときにのみ初期化され、test() 関数がコールされるたびに $a の値を出力してその値を増加させます。

<?php
  function test(){
    static $a = 0;
    echo $a;
    $a++;
  }
?>
静的変数

static 変数は、再帰関数を実現するひとつの手段としても使用されます。次の関数は、中止するタイミングを知るために static 変数 $count を用いて、10 回まで再帰を行います。

<?php
  function test(){
      static $count = 0;
      $count++;
      echo $count;
      if ($count < 10) {
          test();
      }
      $count--;
  }
?>
再帰関数での静的変数の使用

静的変数には、定数式の結果としての値を代入できますが、関数呼び出しのような動的な式の結果を代入すると、パースエラーになります。

<?php
  static $int = 0;          // 正しい
  static $int = 1+2;        // 正しい
  static $int = sqrt(121);  // 間違い(関数を使っています)
?>
再帰関数での静的変数の使用

関連記事