PHP TIPS スーパーグローバル変数を静的クラスでアクセスできるようにする

独自フレームワーク『Lightnig Tone』よりコピペ

PHPグローバル変数がよく使うわりに長くて記述するのが面倒、そして何より目障りなので、以下のように静的クラスでアクセスできるようにした。

<?php
function get_array_to_static_class_code($class,$array){
  $code  = "class $class {";
  if(is_array($array) and count($array)>0){
    foreach($array as $k => $v){
      $k=preg_replace('/\W/','',$k);
      if(preg_match("/^[a-zA-Z_]\w+$/",$k)){
        if(is_array($v)){
          $code.='static public $'.strtolower($k).
            '=array('.implode(',',array_map(
              create_function('$v','return "\'".addslashes($v)."\'";'
            ),$v)).');';
        }else{
          $v=addslashes($v);
          $code.='static public $'.strtolower($k)."='$v';";
        }
      }
    }
  }
  $code.="}";
  return $code;}
}
<?php
// スーパーグローバル変数を静的クラスでアクセスできるようにする
foreach(array('server','get','post','cookie') as $v){
  eval(get_array_to_static_class_code($v,${'_'.strtoupper($v)}));
}

使い方

  • Before
<?php
if($_SERVER['REMOTE_ADDR']=='127.0.0.1' and $_GET['val']=='ok'){
  echo 'ok';
}
  • After
<?php
if(server::$remote_addr=='127.0.0.1' and get::$val=='ok'){
  echo 'ok';
}

スマートでしょ

注意事項

  • Read Onlyなので、値を変更できません。とはいえ、静的クラス作成時以降に値の改変がないことが保障されているので結構使えます。
  • KEY名がすべて小文字に変換されているので注意されたし
  • GET,POSTの配列の場合は未対応です。対応しました。いろいろ問題があるなぁ

追記

  • okinakaさんよりご指摘があり、サニタイズが不十分でしたので修正しました。ご連絡ありがとうございました。