PHPが私に選択肢として提供しているすべてのことと、複雑なビット操作がいつも私にあったことを考えると、私はビットマスクを使ったことは一度もありません。複数のビットマスクを組み合わせる
しかし、最近の好奇心は私が覗くしまったと私はまず最初にGoogleに尋ねた、それは理解することがやや簡単だったが、私がしようとしたときので、おそらく例が私のベストを持ってthis topic
に私をもたらしました違うことをしないでください。
ここで私は、多分、データ型の検証になりますビットマスクを使用すると同様のシナリオ:
class Types {
const STRING = 1;
const INTEGER = 2;
const FLOAT = 4;
const BOOLEAN = 8;
const ARRAYS = 16;
const OBJECT = 32;
protected $flags = 0;
public function __construct($flags) {
$this -> flags = $flags;
}
function validate($data) {
if ($this -> flags & self::STRING && ! is_string($data)) return 1; // not string
if ($this -> flags & self::INTEGER && ! is_int($data)) return 2; // not integer
if ($this -> flags & self::FLOAT && ! is_float($data)) return 3; // not float
if ($this -> flags & self::BOOLEAN && ! is_bool($data)) return 4; // not boolean
if ($this -> flags & self::ARRAYS && ! is_array($data)) return 5; // not array
if ($this -> flags & self::OBJECT && ! is_object($data)) return 6; // not object
return $data;
}
}
として、このコードの実行:私はなし以来、入力文字列を参照してください
$types = new Types(Types::STRING);
var_dump($types -> validate('Stack Overflow'));
をの条件が満たされた。私はTypes::STRING | Types::INTEGER
のようににフラグを変更した場合でも、文字列または整数のいずれかが受け入れられることを期待して、私は私が見た他のすべての例で、こことで、出力として第二return
の文
のようを取得します"ランダムな"ブログは、条件が悪い場合にはelse
ステートメントを使用していました。これは明白なことです(またはオペレータを逆転しますが、それはポイントの横にあります)。しかし、私がこの疑似-code work - 入力データが文字列か整数か、フロートか配列かどうかをテストする意味で - テストする各タイプごとに1つずつ、検証コードをN回複製する必要があります
誰かが私のために少し明確にすることができますか?例えば
複数の型に対するテストの考え方は、あなたが 'return'するとすぐに失敗し、関数全体から飛び出します。最初の妥当性検査が失敗した後の中間です。まず、 "文字列または整数"に対して '' Stack Overflow''をテストするときの実際の期待結果を指定します。ここで_negative_テストを実行しているので、文字列ではなく整数ではなく、関数が実際に返すものは何でしょうか?テストされた値が文字列でも整数でもない場合、それを返すと期待していますか? – CBroe
私は正直なところ、フローを中断するので 'return'や' exit'を使うべきではないことを知っていましたが、やはり私がこの問題に関して具体的に何をしていたかについては全く考えていませんでした。とにかく、入力データがマスクの1つで示されたタイプのものであれば返され、そうでなければプロセスを停止します。フローを終了するか、FALSEを返します。今のところ私はちょうど実験中です – user5613506