处理PHP位标志

wor*_*fjr 3 php function bitflags

我有一个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);
Run Code Online (Sandbox Code Playgroud)

使用标志的函数如下所示;

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;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,如果BAT_TABLE_ROW_ALL已设置,则所有选项都按计划执行.

问题是,如果我出于某种原因添加另一个标志(因此将其设置为8,并将ALL设置为15 - 尽管这将是无关紧要的),我将不得不重写整个函数.这不可能是对的.

有没有更好的方法来编写上面的函数所以我所要做的就是更新标志定义,然后只是将额外的标志执行添加到函数中?

Sam*_*tch 6

按位运算符

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;
}
Run Code Online (Sandbox Code Playgroud)

此外,您可以避免ALL不断提升旗帜:

define('BAT_TABLE_ROW_ALL', -1);
Run Code Online (Sandbox Code Playgroud)

基本上只将所有位设置为1.