今の時点でグローバル変数だらけのプログラムを組む事はないと思いますが
変数汚染をさけるいくつかの方法をメモりました。
[X] 1 namespaceを使う? -> [クラス、インターフェイス、関数、const]には有効だが、[変数]ではダメX
[O] 2 call_user_funcで無名関数を使う。(※Closure)
[O] 3 メインフローなど、すべてclass内で処理
他には絶対初期化して使用する()、変数を使用後破棄(unset)する等。
どのみち処理がわりこまれるとアウトですし、めんどくさいですけど。
<?php
namespace Test;
// エラー出力しない場合
ini_set( 'display_errors', 0 );
//const PHP_EOL = "<br>";
//0 このままでは$iは10の値のまま[ごみ変数]として残る。 (※こんなプログラムは組まないとは思うが ・・・
echo "変数汚染->".PHP_EOL;
for($i=0;$i<10;$i++){
echo $i.PHP_EOL;
}
echo "変数汚染 ->".PHP_EOL;
echo $i.PHP_EOL;
echo $i.PHP_EOL;
//2 namespaceを使う ------------------------------
//変数には適応されないので↑を引き継ぐ
echo "namespaceを使う->".PHP_EOL;
namespace Test2;
echo $i.PHP_EOL;
echo $i.PHP_EOL;
//2 call_user_funcを使う ------------------------------
//上の$iの影響はうけないので何も出力されない
echo "call_user_funcを使う->".PHP_EOL;
call_user_func(function(){
echo $i.PHP_EOL;
});
//3 すべてclass内で処理
//上の$iの影響はうけないので何も出力されない
echo "すべてclass内で処理->".PHP_EOL;
class Main_Flow{
public static function main(){
echo $i.PHP_EOL;
}
}
$main_flow = new Main_Flow();
$main_flow::main();
?>
※補足として
逆にclassなどの中でglobal変数にアクセスしたい時はglobal $iなどで宣言する。
php5.3以下だとregister_globalsがあり、これによりグローバル変数汚染やセキュリティ問題が起きる場合がある
http://php.net/manual/ja/security.globals.php
こんな時代もあったねと・・・
http://www.sound-uz.jp/php/note/registerGlobals
他参考
PHPでグローバル変数を閉じ込める
http://qiita.com/t_cyrill/items/15de4f841737f1381b48
グローバル変数を作らずにファイル間で値をやり取りする
http://qiita.com/Hiraku/items/551ba8bf15b6b23a12a6
他にもやり方はあるんでしょうかね?