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

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

phpinfo(INFO_MODULES | INFO_ENVIRONMENT | INFO_VARIABLES); 

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

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

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

Solutions Collecting From Web of "Что такое использование одной трубы? ' В аргументе функции Do?"

Побитовые операторы

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

 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. 

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