단일 파이프 '|'를 사용하는 것 함수 인수에서 수행합니까?


82

예를 들어 다음 코드를 살펴보십시오.

phpinfo(INFO_MODULES | INFO_ENVIRONMENT | INFO_VARIABLES);

단일 인수가 사용되고 있지만 단일 파이프 기호로 구분 된 옵션 목록을 제공합니다.

  • 함수의 인수 값에 정확히 무슨 일이 일어나고 있습니까?
  • 내 기능에서 동일한 것을 사용할 수 있습니까?
  • 그렇다면 어떻게, 배열을 전달하는 것보다 이점이 있습니까?

이것이 OR의 비트 버전이며, 일반 버전에는 두 개의 파이프가 있습니다.
adeneo

32
아시다시피, 일부 해설자들이 질문을하려는 사용자를 얼마나 비하하는지 이해할 수 없습니다 ... 210K 응답을 가진 사용자가 답변을해야한다는 점!
nickhar dec.

5
질문을하지 않은 평판이 5000 이상인 사용자가 실제로 질문이 없거나 질문을 약점의 징후로 간주하는지 궁금합니다.
피터

15
기호를 검색하기가 어렵다는 점도 알아 두십시오.
Levi Morrison

9
@nickhar .. 그 문서 페이지에 착륙 위해, 당신은 .. 어떻게 든 질문의 요점이다 첫번째 장소에있는 특정 용어에 익숙해야한다고
Obmerk 크로 넨

답변:


136

비트 연산자

비트 연산자는 관련된 값의 비트를 수정합니다. OR기본적으로 비트 단위 는 왼쪽 및 오른쪽 인수의 각 비트를 함께 OR합니다. 예를 들면 :

5 | 2

다음과 같이 비트 / 바이너리로 변환됩니다.

101 | 10

결과는 다음과 같습니다.

111

때문에:

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

그리고 당신이 다음과 같은 경우에 얻는 것과 정확히 일치하는 7의 표현 인 Integer로 :

echo 5 | 2;

Eddie Izzard의 말로 ... 깃발!

Ignacio가 말했듯이, 이것은 여러 플래그를 결합하는 방법으로 PHP (및 기타 언어)에서 가장 자주 사용됩니다. 각 플래그는 일반적으로 값이 일반적으로 다른 오프셋에서 1 비트 만 나타내는 정수로 설정되는 상수로 정의됩니다.

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.

5
멋진 소식에 +1하세요. 나는이 모든 것에 대해 머리를 감싸는 데 많은 어려움을 겪고 있었지만, 당신의 설명과 예제는 내가 방금 PHP 문서를 읽었을 때보 다 훨씬 쉽게 이해할 수 있도록 도와주었습니다. 대단히 감사합니다.
비밀 ツ

3
@cryptic 걱정 - 무엇인가에 대한 모든 검색 후에는 이름은 다소 까다로운 수 없습니다 - 이제 구글 : 검색 용어로 설명과 예제의 단락을 인정하는 경우
Pebbl

4
훌륭한 설명과 예! +1
Sablefoste

16

여러 플래그 의 비트 OR 인 인수를 전달하고 있습니다. 원하는 곳 어디에서나 연산자를 사용할 수 있습니다.


10
SO의 모든 사람이 프로그래밍 전문가가 아니거나 문서로 시작해야 할 부분을 아는 것도 아님을 기억해 주셔서 감사합니다.
Sablefoste
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.