PHPで便利かもしれない表示用ヘルパー関数を作った
$_REQUEST とかのスコープに格納されている値を表示する時に、いつも、issetで判定するなんて耐えられなかったので書きました。
Velocityは、表示する値をrequest,cookie,applicationの順で探して見つかったものを表示してくれます。そのようなことを実現します。関数名はちょっと大胆に「_」にしてみました。
追記:レンタルサーバでは、実行できなかったので、しぶしぶ「__」2文字の関数名に変更しました。php.iniのオプションで_という名前の関数を禁止してるのか?それとも既に同じ名前の関数が存在していたのか?詳細不明です。
<?php __("name") ?>
と書くと、$_REQUEST $_SESSION $_SERVERとスコープの狭い順にnameというキーで格納されている値を探して、見つけたら表示します。
cookieの中だけから、nameというキーで格納されている値を表示する場合は以下です。
<?php __("name", $_COOKIE) ?>
cookieに無かったら、sessionを探し、それ以外は探さない場合は以下です。
<?php __("name", array($_COOKIE, $_SESSION)) ?>
まぁ、変なバグが入る可能性ってのはあるけど、デフォルトの検索順だけ覚えとけば便利なんじゃないでしょうかね。
#PHP初心者なので、こんなのは標準関数であるよ、とか是非突っ込みお願いします。
コード(バグ入り注意。下の追記部分参照)
<?php function h($str) { echo htmlspecialchars($str); } function __($key, $scopes = null) { if (!$scopes) { $scopes = array($_REQUEST, $_SESSION, $_SERVER); } if (!is_array($scopes)) { $scopes = array($scopes); } foreach ($scopes as $scope) { if (!isset($scope[$key])) continue; h($scope[$key]); break; } } ?>
追記20070530
上の、__関数はバグ入りでした。
<?php __("name", $_COOKIE) ?>
のようなHashを一つ指定したとき正しく動作しませんでした。
配列かどうかを判定したときに、Hashが配列と判定されていることに気付かず。。
まさに、↓の状況でした。
こういうことをPHPでやろうと思ったときにできない、何故できないかというとPHPは配列もハッシュ(連想配列)も同じだから。
http://d.hatena.ne.jp/fbis/20060524/1148449927
参考にさせていただいて修正しました。
function __($key, $scopes = null) { if (!$scopes) { $scopes = array($_REQUEST, $_SESSION, $_SERVER); } if (!(is_array($scopes) && !is_hash($scopes))) { $scopes = array($scopes); } foreach ($scopes as $scope) { if (!isset($scope[$key])) continue; h($scope[$key]); break; } } function is_hash (&$array) { reset($array); list($key,$val) = each($array); return is_numeric($key) ? false : true; }
別に、スコープのHashじゃなくても普通のHashにも汎用的に使えることに気付いた。
<?php $item = array( "ID" => "abc", "name" => "山田太郎" ); __("name", $item) ?>
アンダースコアの関数は http://php.net/_ これですね。