2014-10-08 2 views
2

У меня есть класс 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 и ВСЕ на 15, хотя это было бы тривиально, поскольку оно стояло), мне пришлось бы переписать всю функцию. Это неправильно.

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

ответ

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; 
} 

Кроме того, вы можете избежать того, чтобы поднять вверх constantl на ALL флаг у просто:

define('BAT_TABLE_ROW_ALL', -1); 

Который в основном только все биты установлены в 1.

+0

я вижу. Поэтому '&' в основном работает как маска данного определения флага над '$ flag'. Удивительно, другие результаты Google, которые вы можете получить, когда узнаете правильный поисковый запрос! – worldofjr

1

Вы должны использовать bitwise operators

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

if($flag & BAT_TABLE_ROW_FIELD) { 
    // Flag contains the field bit... 
} 
Смежные вопросы