2017-10-18 19 views
0

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回複製する必要があります

誰かが私のために少し明確にすることができますか?例えば

+0

複数の型に対するテストの考え方は、あなたが 'return'するとすぐに失敗し、関数全体から飛び出します。最初の妥当性検査が失敗した後の中間です。まず、 "文字列または整数"に対して '' Stack Overflow''をテストするときの実際の期待結果を指定します。ここで_negative_テストを実行しているので、文字列ではなく整数ではなく、関数が実際に返すものは何でしょうか?テストされた値が文字列でも整数でもない場合、それを返すと期待していますか? – CBroe

+0

私は正直なところ、フローを中断するので 'return'や' exit'を使うべきではないことを知っていましたが、やはり私がこの問題に関して具体的に何をしていたかについては全く考えていませんでした。とにかく、入力データがマスクの1つで示されたタイプのものであれば返され、そうでなければプロセスを停止します。フローを終了するか、FALSEを返します。今のところ私はちょうど実験中です – user5613506

答えて

0

追加の明確化のために

<?php 
header('content-type: text/plain'); 
$amount = rand(1,9); 
$result = $amount/rand(1,9); 
echo "result=$result\ntype=" . gettype($result) . "\n"; 
echo 'validate = ' . validate($result) . "\n"; 
if (validate($result) & 0b00000110){ 
    echo "result is NUMERIC"; 
} 
elseif (validate($result) & 0b00001000){ 
    echo "result is Boolean\n"; 
} 
elseif (validate($result) & 0b11000001){ 
    echo "result is INVALID "; 
} 

function validate($data){ 
    $types = array(
    'string'=>1, 
    'integer'=>2, 
    'double' =>4, 
    'boolean'=>8, 
    'array'=>16, 
    'object'=>32, 
    'resource'=>64, 
    'NULL'=>128, 
    'unknown type'=>256); 
    return $types[gettype($data)]; 
} 
?> 

有効性のために結果を確認したい場合は、種類の配列はまた、次のようになります。

$types = array(
    'string' =>0b000000001, 
    'integer' =>0b000000010, 
    'double' =>0b000000100, 
    'boolean' =>0b000001000, 
    'array' =>0b000010000, 
    'object' =>0b000100000, 
    'resource'=>0b001000000, 
    'NULL' =>0b010000000, 
    'unknown type'=>0b100000000); 

回答例:

result=7 
type=integer 
validate = 2 
result is NUMERIC 

result=0.14285714285714 
type=double 
validate = 4 
result is NUMERIC 
関連する問題