处理PHP位标志

处理PHP位标志,php,function,bitflags,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

我有一个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\u TABLE\u ROW\u ALL
,所有选项都会按计划执行

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

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

您应该使用

很难准确地理解函数试图做什么,但是如果您想检查标志是否包含某个位,可以执行以下操作

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

此外,您还可以避免不断增加
ALL
标志,只需:

define('BAT_TABLE_ROW_ALL', -1);

基本上所有的位都设置为1。

我明白了。所以
&
基本上就像是
$flag
上给定标志定义的掩码。一旦你知道了正确的搜索词,你就能获得其他谷歌搜索结果,这真是太神奇了!
define('BAT_TABLE_ROW_ALL', -1);