もくじ
ローカルスコープ
変数には範囲(スコープ)があり、変数は関数内の範囲で有効
グローバルスコープ
- グローバルスコープは関数内を超えて、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(); // 出力されない

