处理 PHP 位标志

3

我有一个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-尽管它现在很琐碎),我将不得不重写整个函数。这肯定不对。

是否有更好的方法编写上述函数,以便我只需更新标志定义,然后将额外的标志执行添加到函数中即可?

2个回答

7

位运算符

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 标志,方法是:
define('BAT_TABLE_ROW_ALL', -1);

这基本上只是将所有位都设置为1。


我明白了。所以&基本上就像是在$flag上给定标志定义的掩码。一旦你知道正确的搜索词,你会惊讶于其他谷歌搜索结果! - worldofjr

2

您应该使用位运算符

虽然有点难以理解您的函数确切意图,但如果您想要检查标志是否包含某个特定位,可以按照以下方式操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接