Флаги функций PHP, как?

Я пытаюсь создать функцию с флагами в качестве аргументов, но вывод всегда отличается от ожидаемого:

define("FLAG_A", 1);  
define("FLAG_B", 4);  
define("FLAG_C", 7);  
function test_flags($flags) {  
 if($flags & FLAG_A) echo "A";  
 if($flags & FLAG_B) echo "B";  
 if($flags & FLAG_C) echo "C";   
}  
test_flags(FLAG_B | FLAG_C); # Output is always ABC, not BC  

Как я могу исправить эту проблему?

1 ответ

Решение

Флаги должны быть степеней 2, чтобы поразрядно или вместе правильно.

define("FLAG_A", 0x1);
define("FLAG_B", 0x2);
define("FLAG_C", 0x4);
function test_flags($flags) {
  if ($flags & FLAG_A) echo "A";
  if ($flags & FLAG_B) echo "B";
  if ($flags & FLAG_C) echo "C";
}
test_flags(FLAG_B | FLAG_C); # Now the output will be BC

Использование шестнадцатеричной записи для константных значений не делает различий в поведении программы, но является одним идиоматическим способом подчеркнуть программистам, что значения составляют битовое поле. Еще было бы использовать смены: 1<<0, 1<<1, 1<<2и т. д.

Другие вопросы по тегам