функция — Обработка битовых флагов PHP

У меня есть класс 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

Решение

Битовые операторы

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.

5

Другие решения

Вы должны использовать побитовые операторы

Трудно понять, что именно пытается сделать ваша функция, но если вы хотите проверить, содержит ли флаг определенный бит, вы можете сделать следующее

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