PHP

PHP グローバル変数とスコープ

 

ローカルスコープ

変数には範囲(スコープ)があり、変数は関数内の範囲で有効

 

グローバルスコープ

  • グローバルスコープは関数内を超えて、1スクリプト内で有効になる
  • クラス内のstatic変数もグローバル変数と同等
  • シングルトンもある意味グローバル変数と同等

 

使いどころ

  • 関数内を超えて変数を扱いたい場合
  • 変数のスコープは可能な限り最小の範囲にするのが望ましい

 

サンプル

index.php

<?php

$val = (int) 1;


function localScopeTest()
{
    $val = (int) -1;
}

function globalScopeTest()
{
    global $val;
    $val = (int) 2;
}

function globalScopeTest2()
{
    global $val;
    return $val;
}

function globalScopeTest3()
{
    return $val;
}


/////////////////////////////////////////////////////
echo "そのまま<br/>";
echo $val; //1
echo "<hr/>";


echo "ローカルスコープテスト 変わらず1のままのはず<br/>";
localScopeTest();
echo $val; //1
echo "<hr/>";

echo "グローバルスコープテスト 2に変わるはず<br/>";
globalScopeTest();
echo $val; //2
echo "<hr/>";


echo "グローバル変数の危険性<br/>";
echo globalScopeTest2(); // 2
echo "<hr/>";

$val = 9;
echo globalScopeTest2(); //9
echo "<hr/>";


echo "グローバル変数を関数で扱うには関数内でグローバル宣言しなくてはならない<br/>";
echo globalScopeTest3(); // 出力されない

 

 

Demo

/demo/Design-Pattern-Primer-by-PHP/Scope/index.php

 

 

グローバル変数をあまり使わない方が良い理由

echo "グローバル変数の危険性<br/>";
echo globalScopeTest2(); // 2
echo "<hr/>";
 
$val = 9;
echo globalScopeTest2(); //9
echo "<hr/>";

グローバル変数を宣言すると関数外の値の影響を受けてしまう。

どこで影響を受けたかわかりにくくなる。バグが出たり、保守性が悪くなる。

 

グローバル変数を関数内で扱う場合には関数内でグローバル関数の宣言をすること

function globalScopeTest3()
{
    return $val;
}

・・・

echo "グローバル変数を関数で扱うには関数内でグローバル宣言しなくてはならない<br/>";
echo globalScopeTest3(); // 出力されない

 

 

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)