2014-10-08 64 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... 
}