Ответ 1
Побитовые операторы
Побитовые операторы изменяют биты значений. Поразрядный OR
в основном ORs вместе каждый бит как левого, так и правого аргументов. Например:
5 | 2
Переведет биты/двоичные файлы как:
101 | 10
Это приведет к:
111
Потому что:
1 || 0 = 1
0 || 1 = 1
1 || 0 = 1
И как целое число, представляющее собой 7, которое именно вы получаете, если вы:
echo 5 | 2;
По словам Эдди Иззарда... Флаг!
Как утверждает Ignacio, это чаще всего используется в PHP (и других языках) как способ объединения нескольких флагов. Каждый флаг обычно определяется как константа, значение которой обычно устанавливается в целое число, которое представляет только один бит при другом смещении:
define('FLAG_A', 1); /// 0001
define('FLAG_B', 2); /// 0010
define('FLAG_C', 4); /// 0100
define('FLAG_D', 8); /// 1000
Затем, когда вы OR
вместе, они работают каждый на своем собственном смещении бит и никогда не сталкиваются:
FLAG_A | FLAG_C
Переведено на:
1 | 100
Итак, вы включаете:
101
Что представляет собой целое число 5.
Затем весь код должен выполнить — код, который будет реагировать на различные установленные флаги —, следующий (с использованием поразрядного AND
):
$combined_flags = FLAG_A | FLAG_C;
if ( $combined_flags & FLAG_A ) {
/// do something when FLAG_A is set
}
if ( $combined_flags & FLAG_B ) {
/// this wont be reached with the current value of $combined_flags
}
if ( $combined_flags & FLAG_C ) {
/// do something when FLAG_C is set
}
В конце концов, это просто упрощает чтение с помощью названных констант и, как правило, более оптимальным, полагаясь на целочисленные значения, а не на строки или массивы. Еще одно преимущество использования констант заключается в том, что если они когда-либо ошибочны при использовании, то компилятор лучше разбирается и бросает предупреждение... если используется строковое значение, он не знает, что что-то не так.
define('MY_FLAG_WITH_EASY_TYPO', 1);
my_function_that_expects_a_flag( MY_FLAG_WITH_EASY_TPYO );
/// if you have strict errors on the above will trigger an error
my_function_that_expects_a_flag( 'my_string_with_easy_tpyo' );
/// the above is just a string, the compiler knows nowt with
/// regard to it correctness, so instead you'd have to
/// code your own checks.