PHPの変数のスコープ

PHPの変数のスコープについての備忘録です。

 

前提

変数のスコープは、変数を定義したファイルがインクルードした別のファイルにも適応。(WordPressの場合、全てのテンプレートで参照したい変数を作成する場合は、functions.phpに記述)

 

グローバル

関数外で、何もつけずに、$a = 1;と定義。
別のファイルでも参照できるが、関数内は関数の中のローカルスコープの方が優先されるため、下の例では何も出力しない。

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

function test()
{ 
 echo $a; /* ローカルスコープ変数の参照 */ 
}

test();
?>

 

globalキーワード

関数内で global と変数の前につけると、グローバル定義された変数を参照する。
下の例では、3を出力する。

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

function Sum() 
{
 global $a, $b;

$b = $a + $b;
}

Sum();
echo $b;
?>

 

$GLOBALS(配列型)

globalと同じように、$GLOBALSを使うことが出来る。
  • 配列$GLOBALSは連想配列で、グローバル変数の名前がキー、その変数の内容が配列要素の値となってる。
  • スーパーグローバル:どのスコープでも有効で、関数内でもglobalをつける必要がない。
<?php
$a = 1;
$b = 2;

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

Sum();
echo $b;
?>

globalとの違い

  • globalは参照元を参照するだけ。
  • $GLOBALSは参照元の、値も変更する。(static変数の性質をもつ)
<?php
//グローバル変数を定義
$count=1;

//$GLOBALSから参照元のグローバル変数へアクセス
$GLOBALS['count']++;

//参照元のグローバル変数を呼び出す
echo$count."<br/>\n";
?>
結果は:2

 

静的変数(static)

下は関数が呼ばれるたびに、$a が初期化されるため0を出力する。あんまり意味がない。

<?php
function test()
{
    $a = 0;
    echo $a;
    $a++;
}
?>
staticを追加して、静的変数にすると、$a最初の1回だけ初期化され、
それ以降は足されていく。
<?php
 function test()
 {
 static $a = 0;
 echo $a;
 $a++;
 }
 ?>
その他の例
<?php
function test()
{
    static $count = 0;
    $count++;
    echo $count;
    if ($count < 10) {
        test();
    }
    $count--;
}
?>