2014-10-08 63 views
2

我有一個PHP類,其中有一個方法將一個實例打印到一個表格行中。有時候,我希望在開始時不用名稱就打印出一行,有時我希望打印所有的行項目,等等。處理PHP位標誌

我已決定使用位標誌以使代碼更具可讀性,但標誌的處理看起來很可怕。這是我第一次使用位標誌。

我已經在類的頂部定義瞭如下標誌;

define('BAT_TABLE_ROW_PLAYER', 1); 
define('BAT_TABLE_ROW_NOPLAYER', 2); 
define('BAT_TABLE_ROW_FIELD', 4); 
define('BAT_TABLE_ROW_ALL', 7); 

使用標誌的函數看起來像這樣;

function tableLine($flag=BAT_TABLE_ROW_ALL) { 
    if(in_array($flag,[1,3,5,7])) 
     // just return player cell 
    if(in_array($flag,[2,3,6,7])) 
     // return all other cells (except fielding) 
    if(in_array($flag,[4,5,6,7])) 
     // return fielding cells 

    return $rtn; 
} 

所以你可以看到,如果BAT_TABLE_ROW_ALL設置,所有的選項按計劃執行。

問題是,如果我因爲某些原因添加了另一個標誌(因此將其設置爲8,並將ALL設置爲15--儘管這樣會很平常),但我必須重寫整個函數。這不可能是正確的。

有沒有更好的方法來編寫上面的函數,所以我所要做的就是更新標誌定義,然後將額外的標誌執行添加到函數中?

回答

5

Bitwise operators

function tableLine($flag=BAT_TABLE_ROW_ALL) { 
    if($flag & BAT_TABLE_ROW_PLAYER) 
     // just return player cell 
    if($flag & BAT_TABLE_ROW_NOPLAYER) 
     // return all other cells (except fielding) 
    if($flag & BAT_TABLE_ROW_FIELD) 
     // return fielding cells 

    return $rtn; 
} 

而且,你可以避免碰到了ALL標誌constantl Ÿ剛:

define('BAT_TABLE_ROW_ALL', -1); 

這基本上只是還所有位設置爲1

+0

我明白了。所以'&'基本上就像'$ flag'上給定標誌定義的掩碼一樣。一旦您知道正確的搜索字詞,您就可以獲得其他谷歌搜索結果,這真是太棒了! – worldofjr 2014-10-08 00:54:24

1

您應該使用bitwise operators

這是很難準確瞭解您的功能正在試圖做的,但如果你想檢查一個標誌是否含有一定位,你可以做以下

if($flag & BAT_TABLE_ROW_FIELD) { 
    // Flag contains the field bit... 
}