ぷぎがぽぎ このページをアンテナに追加 RSSフィード

2012-11-17

[] 配列のキーの存在チェック(isset)をしながらhtmlspecialcharsするのをちょっと読みやすくする

1枚のPHPでGETパラメータの値をそのまま出力したりする場合、何も考えずに書くとこんな感じになります。

<?php echo (isset($_GET['name']))? htmlspecialchars($_GET['name'], ENT_QUOTES, 'utf-8'): "" ?>

さすがに、毎回これを埋め込むのは嫌ですよね。

なぜなら、同じkey名を2回間違わずに書かなくてはなりませんし、なによりも長い。

なので、次の考えるのがヘルパー関数をつぎように用意することです。

<?php
function h_array_key($key, $array) {
    return isset($array[$key])? htmlspecialchars($array[$key], ENT_QUOTES, 'utf-8'): "";
}
?>

<?php echo h_array_key('name', $_GET) ?>

これでちょっとはシンプルになりました。でも、name以外の項目が増えてくると

<?php echo h_array_key('name', $_GET) ?>
<?php echo h_array_key('email', $_GET) ?>
<?php echo h_array_key('tel', $_POST) ?>

といった感じになってきます。つまり、どのパラメータからなのかを毎回指定しなくてはなりません。

h_array_keyという自分の命名センスの無さも涙ですね。


そして、もう少し綺麗にできないかと思って書いたのが次のコード

<?php
$h_array_key = function($array, $encoding = 'utf-8') {
    return function($key) use ($array, $encoding) {
        return isset($array[$key])? htmlspecialchars($array[$key], ENT_QUOTES, $encoding): "";
    };
};

// $_GETパラメータ用の関数を生成
$_get = $h_array_key($_GET);

// $_POSTパラメータ用の関数を生成
$_post = $h_array_key($_POST);
?>

<?php echo $_get('name') ?>
<?php echo $_get('email') ?>
<?php echo $_post('tel') ?>

クロージャを使っているのでPHP5.3以上ですが、いまどきPHP5.2を使ってるなんてありえ(ry

最初の呼び出しで、どの配列に対しての操作なのかで$_getと$_postという2つの関数を生成し、作成した関数にkey名を渡すようにしています。

呼び出す側もシンプルになりましたし、読みやすい。


スコープが巨大な場合はこのままだと扱いづらいので、スコープが小さいときでないとダメだよねとか万能ではないのですが、特定のメソッド内だけで何度も利用するちょっとした処理は無名関数を上手につかうと可読性がよくなることも多いとおもいます。

2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |