処理のエラーコードをスマートにビット演算で返す
あまりに昨日のエントリーがお粗末だったので今日は多少力を入れます。
使う目的
- ユーザがデータを送った時(例えば名前、メールアドレスなど)にエラーを返したい
- ビット演算を使う数少ない場面かな
- 名前付き配列で返すよりスマートじゃない?
- PHP: ビット演算子 - Manual
環境
php5
方針
- 入力値のバリデートを行う
- エラーなら指定のビットを上げてエラーページに返す
バリデート
仮定はPOSTで幾つかの値が帰ってきた想定
<?php $err = 0; //名前(空ならばNG) if($_POST["name"] != ""){ $err |= 0b0001; } //年齢(正の整数でなければNG) if(! (ctype_digit(strval($_POST["age"])))){ $err |= 0b0010; } //性別("male", "famele"以外はNG) if(!(mb_preg_match($_POST["sex"], "male") || mb_preg_match($_POST["sex"], "famale"))){ $err |= 0b0100; } //規約への同意(チェックボックスが'on'以外はNG) if($_POST['agree'] !== 'on'){ $err |= 0b1000; } return $err; ?>
受け取りの処理
<?php //$errはあるものとして if($err & 0b0001) echo "名前不正"; if($err & 0b0010) echo "年齢不正"; if($err & 0b0100) echo "性別不正"; if($err & 0b1000) echo "同意不正"; if($err & 0b0000) echo "正常"; ?>
備考
a | b ビット和
どちらかにあるビットが1
1001 | 0011 は 1011
a & b ビット積
どちらにもあるビットが1
1001 & 0011 は 0001
ifに入れた場合
理論式が0以外の場合はtrueとなるので、それを利用して振り分け可能
フラグ管理にすると少しだけスマートで、エラーコードを生成する場合にも2進数を10進数に直すだけで表示出来るなど利点も多いですね。