LoginSignup
8
8

More than 5 years have passed since last update.

PHP 変数汚染 (グローバル変数)回避方法のいくつか

Last updated at Posted at 2016-01-08

今の時点でグローバル変数だらけのプログラムを組む事はないと思いますが
変数汚染をさけるいくつかの方法をメモりました。

[X] 1 namespaceを使う? -> [クラス、インターフェイス、関数、const]には有効だが、[変数]ではダメX
[O] 2 call_user_funcで無名関数を使う。(※Closure)
[O] 3 メインフローなど、すべてclass内で処理

他には絶対初期化して使用する()、変数を使用後破棄(unset)する等。
どのみち処理がわりこまれるとアウトですし、めんどくさいですけど。

test.php

<?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


他にもやり方はあるんでしょうかね?

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8