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