У меня есть класс 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 — хотя это было бы тривиально в его нынешнем виде), мне пришлось бы переписать всю функцию. Это не может быть правдой.
Есть ли лучший способ написать функцию выше, так что все, что мне нужно сделать, это обновить определения флагов, а затем просто добавить выполнение дополнительных флагов в функцию?
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.
Вы должны использовать побитовые операторы
Трудно понять, что именно пытается сделать ваша функция, но если вы хотите проверить, содержит ли флаг определенный бит, вы можете сделать следующее
if($flag & BAT_TABLE_ROW_FIELD) {
// Flag contains the field bit...
}