変数のスコープ

変数のスコープ

  • 変数の宣言方法を変えることにより、変数の有効範囲も変わります
  • これを変数のスコープと呼びます
  • 変数は、「{ }(中括弧)」で囲まれた中で定義をすると、その囲まれた中でのみ有効となります。その外側では、使用することができません
  • 括弧内の処理が終了すると、その変数はアクセスできないだけではなく、やがてメモリー上からも消えてしまいます
  • しかし、グローバル変数、スーパーグローバル変数は有効範囲(スコープ)が広がり、「{ }(中括弧)」の外でも使用できるようになります
<?php

// 関数
// ローカル変数(変数のスコープ)

$myname = 'ruby';

function sayHi( $name = 'taguchi' ) {
    $myname = 'php'; // ローカル変数
    return 'hi!' . $name . 'from' . $myname;
}

echo sayHi();
echo $myname;

グローバル変数

<?php
  $a = 1;

  function OutPut() {  // "$aの値(OutPut()内)は「」です"が出力されます
    echo '$a' . 'の値(OutPut()内)は「' . $a . '」です<br>';    /* ローカル変数の参照 */ 
  } 

  OutPut();
    
  // "$aの値(OutPut()内)は「1」です"が出力されます
  echo $a . 'の値(OutPut()外)は「' . $a . '」です';
?>


《実行結果》

  $aの値(OutPut()内)は「」です
  $aの値(OutPut()外)は「1」です


関数内で$aの値が出力されないのは、OutPut関数の{ }内で、グローバル変数の宣言を行っていないからです。
ローカル変数である$aに対して(OutPut関数の{ }内で)代入処理を行っていないため、値は設定されないのです。

  • 以下のようにOutPut関数の{ }内で、$aに対してグローバル変数宣言を行えば使えるようになります
<?php
  $a = 1;

  function OutPut() { 
    global $a;  /* グローバル変数として宣言する */ 
        
    // "$aの値(OutPut()内)は「1」です"が出力されます
    echo $a . 'の値(OutPut()内)は「' . $a . '」です<br>';
    } 

    OutPut();
    
    // $aの値(OutPut()外)は「1」です"が出力されます
    echo $a . 'の値(OutPut()外)は「' . $a . '」です';
?>
  • このように、globalを宣言することにより、関数の{ }内でも関数の{ }外でも使用可能となります

スーパーグローバル変数

  • globalを宣言する以外に、スーパーグローバルと呼ばれている$GLOBALSという連想配列を使って変数の有効範囲を意識することなく使用する方法もあります

$GLOBALS[ '変数名' ];

<?php
  $a = 1;

  function OutPut() {
    // 連想配列$GLOBALSのキーとして、$aを指定
    // これにより$aは関数の外でも使用可能となります
    $GLOBALS[ 'a' ] = $GLOBALS[ 'a' ] + $GLOBALS[ 'a' ] + 8;
  } 

  OutPut();
    
    // 10 が出力されます
    print $a. '<br>';
    
    // 10 が出力されます
    echo $GLOBALS[ 'a' ];
?>