php - 处理 PHP 位标志

标签 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 - 尽管这将是微不足道的),我将不得不重写整个函数。这不可能。

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

最佳答案

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。

关于php - 处理 PHP 位标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26247489/

相关文章:

php - 一张表多字段还是两表少字段?

由于无法解决 libssl 依赖关系,现在在 Ubuntu 14.04 上安装 PHP 7 失败?

c - iOS 中标志结构的用途是什么?

php - MySQL:表内的标准偏差平均值

php - 这个sql IF语句是如何工作的?

android - 在 Kivy 中引用另一个类的函数

类中的c++常量函数

javascript - 如何扩充现有函数,使其懒惰地展开其参数?

c++ - 如何使用 6502 的相应枚举存储处理器状态标志的值