处理PHP位标志

时间:2014-10-08 00:40:06

标签: 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);

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

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 个答案:

答案 0 :(得分: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标志:

define('BAT_TABLE_ROW_ALL', -1);

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

答案 1 :(得分:1)

您应该使用bitwise operators

很难准确理解您的功能正在尝试做什么,但如果您想检查某个标志是否包含某个位,您可以执行以下操作

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