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

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

17 голосов
/ 28 августа 2010

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

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 Ответ

28 голосов
/ 28 августа 2010

Флаги должны быть степенями 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 и т. П.

...