Что делает использование одной трубы '|' В аргументе функции ли?

Возьмите, например, следующий код:

phpinfo(INFO_MODULES | INFO_ENVIRONMENT | INFO_VARIABLES);

Используется один аргумент, но я предоставляю список опций, разделенных одним символом канала.

  • Что именно происходит со значением аргумента в функции?
  • Могу ли я использовать то же самое в своих функциях?
  • Так ли это, и есть ли в этом преимущество, скажем, вместо передачи массива?

Заранее спасибо.

2 ответа

Решение

Битовые операторы

Побитовые операторы изменяют биты участвующих значений. Побитовый OR в основном ИЛИ вместе каждый бит левого и правого аргумента. Например:

5 | 2

Будет переводить в биты / двоичные как:

101 | 10

Что приведет к:

111

Так как:

1 || 0 = 1
0 || 1 = 1
1 || 0 = 1

И как целое число, которое является представлением 7, которое именно то, что вы получите, если вы:

echo 5 | 2;


По словам Эдди Иззарда... Флаг!

Как утверждает Игнасио, это чаще всего используется в 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's correctness, so instead you'd have to
/// code your own checks.

Вы передаете аргумент, который является побитовым ИЛИ нескольких флагов. Вы можете использовать оператора в любом месте.

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