2017-10-18 124 views
0

我從來沒有使用位掩碼,因爲PHP提供給我的所有東西都作爲替代方案,以及多麼複雜的位操作總是在我身上我有點跳過了幾年前的手冊。結合多個位掩碼

但最近的好奇心讓我偷看了,我做的第一件事就是問谷歌,它給我帶來了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陳述,這是顯而易見的事情要做(或倒轉操作員 - 但那不在意),但我不誠實地相信,如果我想使這個僞 - 代碼工作 - 在測試輸入數據是字符串還是整數,浮點數組或數組等等的意義上 - 我將不得不重複驗證碼N次,每種類型我將測試一個

有人能爲我澄清一點嗎?

+0

對於多種類型的測試的整個想法只要你「返回」就會失敗,從而跳出整個函數im在第一次驗證失敗後進行中介。首先,指定將「堆棧溢出」與「字符串或整數」進行比較時實際的預期結果。您正在執行_negative_測試,那麼您希望函數根據它是一個字符串而不是一個整數來實際返回什麼?如果測試值既不是字符串也不是整數,你會期望它返回什麼? – CBroe

+0

我誠實地知道我不應該使用'return'或甚至'exit',因爲它會中斷流程,但是我再也沒有最清楚的知道我在做什麼。無論如何,我希望如果輸入數據是由其中一個掩碼指定的任何類型,則會返回輸入數據,否則會中止流程,例如退出流程或返回「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