PHP에서 유형 저글링 및 (엄격한) 크거나 작은 비교


115

PHP는 유형 저글링으로 유명합니다. 나는 그것이 나를 당혹스럽게한다는 것을 인정해야한다. 그리고 나는 비교에서 기본적인 논리적 / 기본적인 것들을 찾기가 어렵다.

예를 들어 다음과 같은 경우는 $a > $b사실이며, $b > $c사실, 그 의미한다 $a > $c이다 항상 너무 사실?

기본 논리에 따라 라고 말할 수 있지만 PHP를 실제로 신뢰하지 않습니다. 누군가가 그렇지 않은 예를 제공 할 수 있습니까?

또한 왼쪽과 오른쪽 피연산자를 바꾸면 차이가 나는 경우 엄격한보다 작음 및 엄격한보다 큼 연산자 (그 의미는 이전에 같음 비교에서만 알고있는 것으로 엄격하게 설명 됨)로 궁금합니다. 완전히 다른 값 :

# Precondition:
if ($a === $b) {
    throw new Exception(
       'Both are strictly equal - can not compare strictly for greater or smaller'
    );
}

($a > $b) !== ($b > $a)

대부분의 모든 유형 비교 조합에 대해 이러한 대 / 소 비교 연산자 는 문서화되어 있지 않으므로이 경우 설명서를 읽는 것이 실제로 도움이되지 않았습니다.


그 줄을 수정하고 싶 ($a > $b) !== ($b < $a)습니까?
Walter Tross 2013

아, 그래, 오해 했어. 그에 따라 내 대답을 수정해야합니다. 재미는 모든 사람들은 대답 대신 논문을 작성하고 신중하게 질문 ... 읽고 있지
월터 Tross

답변:


208

PHP의 비교 연산자는 여러 가지면에서 컴퓨터 과학적 정의에서 벗어납니다.

등가 관계 를 구성하려면 ==반사적이고 대칭 적이며 전 이적이어야합니다.

  • PHP의 ==연산자는 재귀 적이 지 않습니다 . 즉, $a == $a항상 사실이 아닙니다.

    var_dump(NAN == NAN); // bool(false)

    참고 : 관련된 모든 비교 NAN가 항상 falsePHP에만 국한된 것은 아닙니다. 부동 소수점 산술을위한 IEEE 754 표준 ( 추가 정보 ) 에 의해 요구됩니다 .

  • PHP의 ==연산자는 대칭입니다 . 즉 $a == $b, $b == $a항상 동일합니다.

  • PHP의 ==운영자는 이행하지 예에서, $a == $b그리고 $b == $c않습니다 하지 다음 $a == $c:

    var_dump(true == "a"); // bool(true)
    var_dump("a" == 0);    // bool(true)
    var_dump(true == 0);   // bool(false)
    

부분적 질서를 구성 하기 위해서는<= / >=반사적, 반대 칭적, 전 이적이어야합니다.

  • PHP의 <=연산자는 재귀 적이 지 않습니다 . 즉, $a <= $a항상 사실이 아닙니다 (예 : for ==).

  • PHP의 <=운영자는 안티 대칭되지 , 예에서 $a <= $b$b <= $a따르지 않는 $a == $b:

    var_dump(NAN <= "foo"); // bool(true)
    var_dump("foo" <= NAN); // bool(true)
    var_dump(NAN == "foo"); // bool(false)
    
  • PHP의 <=연산자는 전 이적이지 않습니다 . 예를 들어 from $a <= $b$b <= $c뒤를 따르지 않습니다 $a <= $c(예 : for ==).

  • 추가 : PHP의 <=연산자는 total아닙니다 . 즉 둘 다 $a <= $b이며 $b <= $afalse 일 수 있습니다.

    var_dump(new stdClass <= new DateTime); // bool(false)
    var_dump(new DateTime <= new stdClass); // bool(false)
    

엄격한 부분적 질서를 구성 하려면< / >비 반사적이고 비대칭 적이며 전 이적이어야합니다.

  • PHP의 <연산자는 반사적$a < $a 이지 않습니다. 즉, 결코 사실이 아닙니다. 이것은 PHP 5.4에서만 적용 됩니다 . 이전 INF < INFtrue.

  • PHP의 <연산자는 비대칭아닙니다 . 즉 from $a < $b이 따르지 않습니다 !($b < $a)( <=반대 칭이 아닌 경우 와 동일한 예 ).

  • PHP의 <운영자입니다 는 이행하지 에서, 즉 $a < $b$b < $c따르지 않는 $a < $c:

    var_dump(-INF < 0);    // bool(true)
    var_dump(0 < TRUE);    // bool(true)
    var_dump(-INF < TRUE); // bool(false)
    
  • 추가 : PHP의 <운영자입니다 trichotomous하지 의 즉 모든 $a < $b, $b < $a$a == $b(경우와 예 같은 거짓이 될 수 <=총되지 않는).

  • 추가 : PHP의 <운영자가 될 수 있습니다 원형 , 그것이 가능 즉 $a < $b, $b < $c$c < $a:

    var_dump(INF < []);           // bool(true)
    var_dump([] < new stdClass);  // bool(true)
    var_dump(new stdClass < INF); // bool(true)
    

    참고 : 위의 예에서는 "stdClass 클래스의 객체를 double로 변환 할 수 없습니다"라는 알림이 표시됩니다.

PHP Sadness 52- 비교 연산자에서 PHP 비교 연산자에 대한 몇 가지 멋진 그래프를 찾을 수 있습니다 .

마지막으로, PHP 보장 하는 두 가지 동등성이 있음을 지적하고 싶습니다 (다른 모든 것과는 달리). 컴파일러가 하나를 다른 하나로 줄이기 때문에이 두 가지는 항상 유지됩니다.

($a > $b) == ($b < $a)
($a >= $b) == ($b <= $a)

2
와, 좋은 답변입니다. 이 같은 PHP와 논리적 표현을 공식화하는 것은 불가능합니다 그래서 ($a > $b) and ($b > $c)$a > $c문서가 사람들을 말한다하더라도 </ >연산자는 말할 엄격한 ?
hakre

26
IMHO 연산자는 수학 규칙을 따르지만 동일한 데이터 유형을 다룰 때만 적용됩니다. 유형 캐스팅은 여기에서 (그리고 다른 많은 상황에서) 혼란을 실제로 만드는 것입니다. 캐스팅은 ... 너무 엄격하게 비교 연산자가 혼동되지 말해서, 사업자 이전에 완료되며 숫자와 문자열과 특수 값 형식 변환을 비교하면
반호

6
@ ivanhoe011 진실은 : 둘 다 : PHP의 비교 규칙이며, PHP의 캐스팅 규칙이 다를 단순히 그 말할 수 $a == $b와 동일합니다 (type) $a === (type) $b. 이것의 간단한 예는이다 "15" == "0xf",하지만 (int) "15" !== (int) "0xf". 그리고 PHP 모두 비교 및 캐스팅 규칙 ^^ 완전히 미친
NikiC

3
@NikiC : 물론 (int)"0xf"정수로 평가됩니다 . 이 예의 비교는 예상대로 정확하게 작동합니다. 여기서 혼란스러운 것은 캐스팅입니다. 인정 할게요, 진짜 비교 문제 였지만 특별한 경우 였고, 당신이 지적한대로 해결되었습니다. Great answer .. +100 !== 15(INF < INF) === true
FtDRbwLXw6

1
필자는 당시 유형 강제에 대해 합리적인 결정 중 일부에 대해 PHP 디자이너를 잘못한 것은 아니지만 ...이 디자인 선택의 결과를 알아 차리고 선택이 분명히 잘못되었음을 즉시 깨달았어야한다고 생각합니다. 가장 분명한 예는 @ravz의 의견입니다.
Chad

88

없습니다 엄격한 동일한 비교 연산자 ( >==또는 <==PHP에서) (적어도 PHP 5.6.14으로는) 하지만, 수있는 몇 가지 방법이 있습니다 엄격한 유형 검사를 시행 그레이터 / 하단을 확인하기 전에이 :

  1. 두 변수 유형을 모두 확인하십시오. if (gettype($a) === gettype($b))
  2. 예를 들어 필요한 유형 캐스팅을 강제하십시오. if ((string)$a === (string)$b)
  3. 예를 들어 필요한 유형 저글을 강제하십시오. if (($a . '') === ($b . ''))

다음 사항에 유의하십시오.

  • 부동 소수점 정밀도 가 제한됨
  • INF그리고 아래 NAN유형입니다float
  • 일부 무한대가 다른 동일 무한대를 (이후 PHP 5.4)
  • 과학적 표기법 e은 항상 유형 float이며 integer숫자가 작더라도 절대로 입력 하지 않습니다.
  • 넘어가 PHP_INT_MAX는 정수 는 자동으로 다음으로 변환됩니다.float
  • 시스템의 경계를 넘은 플로트는 INF가치를 얻습니다.
  • 정의되지 않은 변수는 유형 및 값입니다. NULL
  • 앞에 오는 정수 0는 8 진수에서 10 진수로 변환됩니다 (규칙에 따라).
  • 선행 0 있는 정수를 포함하는 문자열을 정수로 변환 하면 선행0

이국적인 비교 목록 :

아주 이상한:
     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  float (NAN) float (-INF) 거짓 거짓 거짓 거짓 거짓 거짓
  float (NAN) float (0) 거짓 거짓 거짓 거짓 거짓 거짓
  float (NAN) float (1) 거짓 거짓 거짓 거짓 거짓 거짓
  float (NAN) float (INF) 거짓 거짓 거짓 거짓 거짓 거짓
  float (NAN) float (NAN) 거짓 거짓 거짓 거짓 거짓 거짓
  float (NAN) int (-1) 거짓 거짓 거짓 거짓 거짓 거짓
  float (NAN) int (0) 거짓 거짓 거짓 거짓 거짓 거짓
  float (NAN) int (1) 거짓 거짓 거짓 거짓 거짓 거짓

동일하지만 동일하지는 않음 :

     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  NULL (NULL) array () false false true true true false
  NULL (NULL) bool (false) 거짓 거짓 참 참 참 거짓 거짓
  NULL (NULL) float (0) false false true true true false
  NULL (NULL) int (0) false false true true true false
  NULL (NULL) str ( '') 거짓 거짓 참 참 참 거짓 거짓
   array () bool (false) 거짓 거짓 참 참 참 거짓
 bool (false) float (0) false false true true true false
 bool (false) int (0) false false true true true false
   str ( '') bool (false) 거짓 거짓 참 참 참 거짓 거짓
 bool (false) str ( '0') false false true true true false
 float (-INF) bool (true) 거짓 거짓 참 참 참 거짓 거짓
  bool (true) float (1) false false true true true false
  float (INF) bool (true) 거짓 거짓 참 참 참 거짓
  float (NAN) bool (true) 거짓 거짓 참 참 참 거짓 거짓
  bool (true) int (-1) false false true true true false
  bool (true) int (1) false false true true true false
  bool (true) str ( "\ 0") false false true true true false
  bool (true) str ( '+') 거짓 거짓 참 참 참 거짓 거짓
  bool (true) str ( '-') 거짓 거짓 참 참 참 거짓 거짓
  bool (true) str ('01 ') 거짓 거짓 참 참 참 거짓 거짓
  bool (true) str ( '1') 거짓 거짓 참 참 참 거짓 거짓
  bool (true) str ( 'false') 거짓 거짓 참 참 참 거짓 거짓
 str ( 'text') bool (true) 거짓 거짓 참 참 참 거짓 거짓
 str ( 'true') bool (true) 거짓 거짓 참 참 참 거짓 거짓
    int (0) float (0) false false true true true false
  str ( "\ 0") float (0) 거짓 거짓 참 참 참 거짓 거짓
   str ( '') float (0) false false true true true false
   str ( '+') float (0) 거짓 거짓 참 참 참 거짓 거짓
   str ( '-') float (0) 거짓 거짓 참 참 참 거짓 거짓
   str ( '0') float (0) 거짓 거짓 참 참 참 거짓 거짓
 str ( 'false') float (0) 거짓 거짓 참 참 참 거짓 거짓
 str ( 'text') float (0) 거짓 거짓 참 참 참 거짓 거짓
 str ( 'true') float (0) 거짓 거짓 참 참 참 거짓 거짓
    int (1) float (1) false false true true true false
   float (1) str ('01 ') 거짓 거짓 참 참 참 거짓 거짓
   float (1) str ( '1') 거짓 거짓 참 참 참 거짓 거짓
  str ( "\ 0") int (0) 거짓 거짓 참 참 참 거짓
   str ( '') int (0) 거짓 거짓 참 참 참 거짓 거짓
   str ( '+') int (0) 거짓 거짓 참 참 참 거짓 거짓
   str ( '-') int (0) 거짓 거짓 참 참 참 거짓 거짓
    int (0) str ( '0') 거짓 거짓 참 참 참 거짓 거짓
 str ( 'false') int (0) 거짓 거짓 참 참 참 거짓 거짓
 str ( 'text') int (0) 거짓 거짓 참 참 참 거짓 거짓
 str ( 'true') int (0) 거짓 거짓 참 참 참 거짓 거짓
    int (1) str ('01 ') 거짓 거짓 참 참 참 거짓 거짓
    int (1) str ( '1') 거짓 거짓 참 참 참 거짓 거짓
   str ( '1') str ('01 ') 거짓 거짓 참 참 참 거짓 거짓

동시에 낮고 큰가?

     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  float (NAN) str ( "\ 0") true true true true false false
  float (NAN) str ( '') 참 참 참 참 거짓 거짓
  float (NAN) str ( '+') 참 참 참 참 거짓 거짓 거짓
  float (NAN) str ( '-') 참 참 참 참 거짓 거짓 거짓
  float (NAN) str ( '0') 참 참 참 참 거짓 거짓 거짓
  float (NAN) str ('01 ') 참 참 참 참 거짓 거짓 거짓
  float (NAN) str ( '1') 참 참 참 참 거짓 거짓 거짓
  float (NAN) str ( 'false') 참 참 참 참 거짓 거짓 거짓
  float (NAN) str ( 'text') 참 참 참 참 거짓 거짓 거짓
  float (NAN) str ( 'true') 참 참 참 참 거짓 거짓 거짓

동일하고 동일 함 :

     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  NULL (NULL) NULL (NULL) false false true true true true
 float (-INF) float (-INF) 거짓 거짓 참 참 참 참
  float (INF) float (INF) false false true true true true

낮거나 큰 :

     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  NULL (NULL) bool (true) 거짓 참 참 거짓 거짓 거짓
 float (-INF) NULL (NULL) 참 거짓 거짓 참 거짓 거짓
  NULL (NULL) float (1) 거짓 참 참 거짓 거짓 거짓
  float (INF) NULL (NULL) 참 거짓 거짓 참 거짓 거짓
  float (NAN) NULL (NULL) 참 거짓 거짓 참 거짓 거짓
  NULL (NULL) int (-1) 거짓 참 참 거짓 거짓 거짓
  NULL (NULL) int (1) 거짓 참 참 거짓 거짓 거짓
  NULL (NULL) str ( "\ 0") 거짓 참 참 거짓 거짓 거짓
  NULL (NULL) str ( '+') 거짓 참 참 거짓 거짓 거짓
  NULL (NULL) str ( '-') 거짓 참 참 거짓 거짓 거짓
  NULL (NULL) str ( '0') 거짓 참 참 거짓 거짓 거짓
  NULL (NULL) str ('01 ') 거짓 참 참 거짓 거짓 거짓
  NULL (NULL) str ( '1') 거짓 참 참 거짓 거짓 거짓
  NULL (NULL) str ( 'false') 거짓 참 참 거짓 거짓 거짓
  NULL (NULL) str ( 'text') 거짓 참 참 거짓 거짓 거짓
  NULL (NULL) str ( 'true') 거짓 참 참 거짓 거짓 거짓
   array () bool (true) 거짓 참 참 거짓 거짓 거짓
 float (-INF) array () false true true false false false
   array () float (0) true false false true false false
   array () float (1) true false false true false false
  float (INF) array () false true true false false false
  float (NAN) array () false true true false false false
   array () int (-1) 참 거짓 거짓 참 거짓 거짓
   array () int (0) 참 거짓 거짓 참 거짓 거짓
   array () int (1) 참 거짓 거짓 참 거짓 거짓
   array () str ( "\ 0") 참 거짓 거짓 참 거짓 거짓
   str ( '') array () false true true false false false
   array () str ( '+') 참 거짓 거짓 참 거짓 거짓
   array () str ( '-') 참 거짓 거짓 참 거짓 거짓
   array () str ( '0') 참 거짓 거짓 참 거짓 거짓
   array () str ('01 ') 참 거짓 거짓 참 거짓 거짓
   array () str ( '1') 참 거짓 거짓 참 거짓 거짓
   array () str ( 'false') 참 거짓 거짓 참 거짓 거짓
   array () str ( 'text') 참 거짓 거짓 참 거짓 거짓
   array () str ( 'true') 참 거짓 거짓 참 거짓 거짓
  bool (true) bool (false) 참 거짓 거짓 참 거짓 거짓
 float (-INF) bool (false) 참 거짓 거짓 참 거짓 거짓
   float (1) bool (false) 참 거짓 거짓 참 거짓 거짓
  float (INF) bool (false) 참 거짓 거짓 참 거짓 거짓
  float (NAN) bool (false) 참 거짓 거짓 참 거짓 거짓
 bool (false) int (-1) 거짓 참 참 거짓 거짓 거짓
    int (1) bool (false) 참 거짓 거짓 참 거짓 거짓
 bool (false) str ( "\ 0") 거짓 참 참 거짓 거짓 거짓
 bool (false) str ( '+') 거짓 참 참 거짓 거짓 거짓
 bool (false) str ( '-') 거짓 참 참 거짓 거짓 거짓
 bool (false) str ('01 ') 거짓 참 참 거짓 거짓 거짓
   str ( '1') bool (false) 참 거짓 거짓 참 거짓 거짓
 bool (false) str ( 'false') 거짓 참 참 거짓 거짓 거짓
 str ( 'text') bool (false) 참 거짓 거짓 참 거짓 거짓
 str ( 'true') bool (false) 참 거짓 거짓 참 거짓 거짓
  bool (true) float (0) true false false true false false
  bool (true) int (0) 참 거짓 거짓 참 거짓 거짓
   str ( '') bool (true) 거짓 참 참 거짓 거짓 거짓
  bool (true) str ( '0') 참 거짓 거짓 참 거짓 거짓
 float (-INF) float (0) 거짓 참 참 거짓 거짓 거짓
 float (-INF) float (1) 거짓 참 참 거짓 거짓 거짓
  float (INF) float (-INF) 참 거짓 거짓 참 거짓 거짓
 float (-INF) int (-1) 거짓 참 참 거짓 거짓 거짓
 float (-INF) int (0) 거짓 참 참 거짓 거짓 거짓
 float (-INF) int (1) 거짓 참 참 거짓 거짓 거짓
 float (-INF) str ( "\ 0") 거짓 참 참 거짓 거짓 거짓
 float (-INF) str ( '') 거짓 참 참 거짓 거짓 거짓
 float (-INF) str ( '+') 거짓 참 참 거짓 거짓 거짓
 float (-INF) str ( '-') 거짓 참 참 거짓 거짓 거짓
 float (-INF) str ( '0') 거짓 참 참 거짓 거짓 거짓
 float (-INF) str ('01 ') 거짓 참 참 거짓 거짓 거짓
 float (-INF) str ( '1') 거짓 참 참 거짓 거짓 거짓
 float (-INF) str ( 'false') 거짓 참 참 거짓 거짓 거짓
 float (-INF) str ( 'text') 거짓 참 참 거짓 거짓 거짓
 float (-INF) str ( 'true') 거짓 참 참 거짓 거짓 거짓
   float (1) float (0) 참 거짓 거짓 참 거짓 거짓
  float (INF) float (0) 참 거짓 거짓 참 거짓 거짓
   float (0) int (-1) 참 거짓 거짓 참 거짓 거짓
    int (1) float (0) 참 거짓 거짓 참 거짓 거짓
   float (0) str ('01 ') 거짓 참 참 거짓 거짓 거짓
   str ( '1') float (0) 참 거짓 거짓 참 거짓 거짓
  float (INF) float (1) 참 거짓 거짓 참 거짓 거짓
   float (1) int (-1) 참 거짓 거짓 참 거짓 거짓
   float (1) int (0) 참 거짓 거짓 참 거짓 거짓
   float (1) str ( "\ 0") 참 거짓 거짓 참 거짓 거짓
   str ( '') float (1) 거짓 참 참 거짓 거짓 거짓
   float (1) str ( '+') 참 거짓 거짓 참 거짓 거짓
   float (1) str ( '-') 참 거짓 거짓 참 거짓 거짓
   float (1) str ( '0') 참 거짓 거짓 참 거짓 거짓
   float (1) str ( 'false') 참 거짓 거짓 참 거짓 거짓
 str ( 'text') float (1) 거짓 참 참 거짓 거짓 거짓
 str ( 'true') float (1) 거짓 참 참 거짓 거짓 거짓
  float (INF) int (-1) 참 거짓 거짓 참 거짓 거짓
  float (INF) int (0) 참 거짓 거짓 참 거짓 거짓
  float (INF) int (1) 참 거짓 거짓 참 거짓 거짓
  float (INF) str ( "\ 0") 참 거짓 거짓 참 거짓 거짓
  float (INF) str ( '') 참 거짓 거짓 참 거짓 거짓
  float (INF) str ( '+') 참 거짓 거짓 참 거짓 거짓
  float (INF) str ( '-') 참 거짓 거짓 참 거짓 거짓
  float (INF) str ( '0') 참 거짓 거짓 참 거짓 거짓
  float (INF) str ('01 ') 참 거짓 거짓 참 거짓 거짓
  float (INF) str ( '1') 참 거짓 거짓 참 거짓 거짓
  float (INF) str ( 'false') 참 거짓 거짓 참 거짓 거짓
  float (INF) str ( 'text') 참 거짓 거짓 참 거짓 거짓
  float (INF) str ( 'true') 참 거짓 거짓 참 거짓 거짓
    int (0) int (-1) 참 거짓 거짓 참 거짓 거짓
    int (1) int (-1) 참 거짓 거짓 참 거짓 거짓
  str ( "\ 0") int (-1) 참 거짓 거짓 참 거짓 거짓
   str ( '') int (-1) 참 거짓 거짓 참 거짓 거짓
   str ( '+') int (-1) 참 거짓 거짓 참 거짓 거짓
   str ( '-') int (-1) 참 거짓 거짓 참 거짓 거짓
   str ( '0') int (-1) 참 거짓 거짓 참 거짓 거짓
   int (-1) str ('01 ') 거짓 참 참 거짓 거짓 거짓
   str ( '1') int (-1) 참 거짓 거짓 참 거짓 거짓
 str ( 'false') int (-1) 참 거짓 거짓 참 거짓 거짓
 str ( 'text') int (-1) 참 거짓 거짓 참 거짓 거짓
 str ( 'true') int (-1) 참 거짓 거짓 참 거짓 거짓
    int (1) int (0) 참 거짓 거짓 참 거짓 거짓
    int (0) str ('01 ') 거짓 참 참 거짓 거짓 거짓
   str ( '1') int (0) 참 거짓 거짓 참 거짓 거짓
    int (1) str ( "\ 0") 참 거짓 거짓 참 거짓 거짓
   str ( '') int (1) 거짓 참 참 거짓 거짓 거짓
    int (1) str ( '+') 참 거짓 거짓 참 거짓 거짓
    int (1) str ( '-') 참 거짓 거짓 참 거짓 거짓
    int (1) str ( '0') 참 거짓 거짓 참 거짓 거짓
    int (1) str ( 'false') 참 거짓 거짓 참 거짓 거짓
 str ( 'text') int (1) 거짓 참 참 거짓 거짓 거짓
 str ( 'true') int (1) 거짓 참 참 거짓 거짓 거짓
   str ( '') str ( "\ 0") 거짓 참 참 거짓 거짓 거짓
   str ( '+') str ( "\ 0") 참 거짓 거짓 거짓 거짓 거짓
   str ( '-') str ( "\ 0") 참 거짓 거짓 거짓 거짓 거짓
  str ( "\ 0") str ( '0') 거짓 참 참 거짓 거짓 거짓
  str ( "\ 0") str ('01 ') 거짓 참 참 거짓 거짓 거짓
   str ( '1') str ( "\ 0") 참 거짓 거짓 거짓 거짓 거짓
 str ( 'false') str ( "\ 0") 참 거짓 거짓 거짓 거짓 거짓
 str ( 'text') str ( "\ 0") 참 거짓 거짓 거짓 거짓 거짓
 str ( 'true') str ( "\ 0") 참 거짓 거짓 거짓 거짓 거짓
   str ( '') str ( '+') 거짓 참 참 거짓 거짓 거짓
   str ( '') str ( '-') 거짓 참 참 거짓 거짓 거짓
   str ( '') str ( '0') 거짓 참 참 거짓 거짓 거짓
   str ( '') str ('01 ') 거짓 참 참 거짓 거짓 거짓
   str ( '') str ( '1') 거짓 참 참 거짓 거짓 거짓
   str ( '') str ( 'false') 거짓 참 참 거짓 거짓 거짓
   str ( '') str ( 'text') 거짓 참 참 거짓 거짓 거짓
   str ( '') str ( 'true') 거짓 참 참 거짓 거짓 거짓
   str ( '-') str ( '+') 참 거짓 거짓 참 거짓 거짓
   str ( '+') str ( '0') 거짓 참 참 거짓 거짓 거짓
   str ( '+') str ('01 ') 거짓 참 참 거짓 거짓 거짓
   str ( '1') str ( '+') 참 거짓 거짓 참 거짓 거짓
 str ( 'false') str ( '+') 참 거짓 거짓 참 거짓 거짓
 str ( 'text') str ( '+') 참 거짓 거짓 참 거짓 거짓
 str ( 'true') str ( '+') 참 거짓 거짓 참 거짓 거짓
   str ( '-') str ( '0') 거짓 참 참 거짓 거짓 거짓
   str ( '-') str ('01 ') 거짓 참 참 거짓 거짓 거짓
   str ( '1') str ( '-') 참 거짓 거짓 참 거짓 거짓
 str ( 'false') str ( '-') 참 거짓 거짓 참 거짓 거짓
 str ( 'text') str ( '-') 참 거짓 거짓 참 거짓 거짓
 str ( 'true') str ( '-') 참 거짓 거짓 참 거짓 거짓
   str ( '0') str ('01 ') 거짓 참 참 거짓 거짓 거짓
   str ( '1') str ( '0') 참 거짓 거짓 참 거짓 거짓
 str ( 'false') str ( '0') 참 거짓 거짓 참 거짓 거짓
 str ( 'text') str ( '0') 참 거짓 거짓 참 거짓 거짓
 str ( 'true') str ( '0') 참 거짓 거짓 참 거짓 거짓
 str ( 'false') str ('01 ') 참 거짓 거짓 참 거짓 거짓
 str ( 'text') str ('01 ') 참 거짓 거짓 참 거짓 거짓
 str ( 'true') str ('01 ') 참 거짓 거짓 참 거짓 거짓
   str ( '1') str ( 'false') 거짓 참 참 거짓 거짓 거짓
 str ( 'text') str ( '1') 참 거짓 거짓 참 거짓 거짓
 str ( 'true') str ( '1') 참 거짓 거짓 참 거짓 거짓
 str ( 'text') str ( 'false') 참 거짓 거짓 참 거짓 거짓
 str ( 'true') str ( 'false') 참 거짓 거짓 참 거짓 거짓
 str ( 'true') str ( 'text') 참 거짓 거짓 참 거짓 거짓

$a > $b > $c수수께끼 : $a이보다 크지 않은 경우 $c.

A <C : float (NAN)> str ( 'a')> str ( '')
A <C : float (NAN)> str ( 'a')> str ( '1')
A <C : float (NAN)> str ( 'a')> str ( 'A')
A <C : float (NAN)> str ( 'a')> str ( '0')
A <C : float (NAN)> str ( '1')> str ( '')
A <C : float (NAN)> str ( '1')> str ( '0')
A <C : float (NAN)> str ( 'A')> str ( '')
A <C : float (NAN)> str ( 'A')> str ( '1')
A <C : float (NAN)> str ( 'A')> str ( '0')
A <C : float (NAN)> str ( '0')> str ( '')
A <C : str ( '')> float (NAN)> str ( 'a')
A <C : str ( '')> float (NAN)> str ( '1')
A <C : str ( '')> float (NAN)> str ( 'A')
A <C : str ( '')> float (NAN)> str ( '0')
A <C : str ( 'a')> str ( '')> float (NAN)
A <C : str ( 'a')> str ( '1')> float (NAN)
A <C : str ( 'a')> str ( 'A')> float (NAN)
A <C : str ( 'a')> str ( '0')> float (NAN)
A <C : str ( '0')> str ( '')> float (NAN)
A == C : bool (true)> str ( '')> float (NAN)
A == C : bool (true)> str ( '')> float (-INF)
A == C : bool (true)> str ( '')> int (-1)
A == C : bool (true)> str ( '')> float (-1)
A == C : bool (true)> array ()> float (NAN)
A == C : bool (true)> array ()> float (INF)
A == C : bool (true)> array ()> float (-INF)
A == C : bool (true)> array ()> str ( 'a')
A == C : bool (true)> array ()> int (1)
A == C : bool (true)> array ()> float (1)
A == C : bool (true)> array ()> str ( '1')
A == C : bool (true)> array ()> str ( 'A')
A == C : bool (true)> array ()> int (-1)
A == C : bool (true)> array ()> float (-1)
A == C : bool (true)> int (0)> float (-INF)
A == C : bool (true)> int (0)> int (-1)
A == C : bool (true)> int (0)> float (-1)
A == C : bool (true)> str ( '0')> float (NAN)
A == C : bool (true)> str ( '0')> float (-INF)
A == C : bool (true)> str ( '0')> int (-1)
A == C : bool (true)> str ( '0')> float (-1)
A == C : bool (true)> float (0)> float (-INF)
A == C : bool (true)> float (0)> int (-1)
A == C : bool (true)> float (0)> float (-1)
A == C : int (1)> str ( 'a')> str ( '1')
A == C : int (1)> str ( 'A')> str ( '1')
A == C : float (1)> str ( 'a')> str ( '1')
A == C : float (1)> str ( 'A')> str ( '1')
A == C : str ( 'a')> str ( '1')> int (0)
A == C : str ( 'a')> str ( '1')> float (0)
A == C : str ( '')> float (-INF)> NULL (NULL)
A == C : str ( '')> float (-INF)> bool (false)
A == C : str ( '')> int (-1)> NULL (NULL)
A == C : str ( '')> int (-1)> bool (false)
A == C : str ( '')> float (-1)> NULL (NULL)
A == C : str ( '')> float (-1)> bool (false)
A == C : array ()> float (NAN)> NULL (NULL)
A == C : array ()> float (NAN)> bool (false)
A == C : array ()> float (INF)> NULL (NULL)
A == C : array ()> float (INF)> bool (false)
A == C : array ()> float (-INF)> NULL (NULL)
A == C : array ()> float (-INF)> bool (false)
A == C : array ()> str ( 'a')> NULL (NULL)
A == C : array ()> str ( 'a')> bool (false)
A == C : array ()> int (1)> NULL (NULL)
A == C : array ()> int (1)> bool (false)
A == C : array ()> float (1)> NULL (NULL)
A == C : array ()> float (1)> bool (false)
A == C : array ()> str ( '1')> NULL (NULL)
A == C : array ()> str ( '1')> bool (false)
A == C : array ()> str ( 'A')> NULL (NULL)
A == C : array ()> str ( 'A')> bool (false)
A == C : array ()> str ( '0')> NULL (NULL)
A == C : array ()> int (-1)> NULL (NULL)
A == C : array ()> int (-1)> bool (false)
A == C : array ()> float (-1)> NULL (NULL)
A == C : array ()> float (-1)> bool (false)
A == C : str ( '')> float (NAN)> bool (false)
A == C : str ( '')> float (NAN)> NULL (NULL)
A == C : str ( 'A')> str ( '1')> int (0)
A == C : str ( 'A')> str ( '1')> float (0)
A == C : int (0)> float (-INF)> NULL (NULL)
A == C : int (0)> float (-INF)> bool (false)
A == C : int (0)> int (-1)> NULL (NULL)
A == C : int (0)> int (-1)> bool (false)
A == C : int (0)> float (-1)> NULL (NULL)
A == C : int (0)> float (-1)> bool (false)
A == C : str ( '0')> float (NAN)> bool (false)
A == C : str ( '0')> float (-INF)> bool (false)
A == C : str ( '0')> int (-1)> bool (false)
A == C : str ( '0')> float (-1)> bool (false)
A == C : float (0)> float (-INF)> NULL (NULL)
A == C : float (0)> float (-INF)> bool (false)
A == C : float (0)> int (-1)> NULL (NULL)
A == C : float (0)> int (-1)> bool (false)
A == C : float (0)> float (-1)> NULL (NULL)
A == C : float (0)> float (-1)> bool (false)
A === C : str ( '0')> float (NAN)> str ( '0')
A === C : str ( '')> float (NAN)> str ( '')
A === C : str ( 'a')> float (NAN)> str ( 'a')
A === C : str ( '1')> float (NAN)> str ( '1')
A === C : str ( 'A')> float (NAN)> str ( 'A')

재미있는 문자열 비교 : 'Queen' >'King' >'Jack' >'Ace'

또한 쌍을 다루는 PHP 유형 비교 테이블 을 확인하십시오 .

  • isset()is_null()
  • if()empty()
  • 부울 ==대.===

라이브에서 PHP 버전 간의 차이점을 확인하십시오. http://3v4l.org/MAfDu .


26
고정 열 헤더가있는 스크롤 가능한 "테이블"은 물론 +1-멋진 아이디어;)
hakre

유형 캐스팅시 엄격한 연산자를 사용해야합니까? 내 말은 당신이 썼지 if ( (string)$a===(string)$b )만 이것은 정확히 똑같지 if ( (string)$a==(string)$b )않습니까?
Voitcus

두 유형 캐스트에 대한 예 @Voitcus (string)1==(string)'01'> - bool(true)입력 - 저글링을위한 (1 . '')=='01'-> bool(true)아니 정확히 같은 ===당신이 얻을 것이다 때 bool(false)두 계정에
CSᵠ

1
한 가지 중요한 점 : 8 진수 값은 "할당시 변환"되지 않고 컴파일러에 의해 해석되므로 ASCII를 실제 이진수로 변환해야합니다.
IMSoP 2013 년

INFINITY is equal to INFINITY which is mathematically incorrect!확실히 논쟁의 여지가있는 진술입니다. 또한 NaN규칙에 따라 내가 아는 프로그래밍 언어의 어떤 것보다 크거나 작거나 같지 않음에 유의하십시오 .
DaveRandom 2013 년

22

질문의 두 번째 부분을 수정 한 후 해당 부분에 대한 답변을 다른 사람에게 남깁니다. 질문의 첫 번째 부분, 즉 <>연산자가 전 이적이지 않은 예가 있는지 여부에 대해 가장 놀라운 답변을 제공하고 싶습니다 . 여기있어.

모두 다음과 true같습니다.

"10" < "1a"
"1a" < "2"
"10" > "2"

경우 <였다 전이 ( $a < $b$b < $c$a < $c), 마지막 줄 것

"10" < "2"

그러나 PHP는 친절하고 (?!) 가능할 때마다 문자열을 숫자로 해석하려고합니다.

위의 비운 송성으로 인해 두 요소가 없고 NAN 이 아닌 경우에도 동일한 요소를 입력 순서에 따라 다른 순서 로 sort()정렬 할 수 있습니다 . 나는 이것을 sort () 에 대한 주석 에서 지적했는데 , 그 본질은 다음과 같다.==

sort(array("10", "1a", "2" )) => array("10", "1a", "2" )
sort(array("10", "2",  "1a")) => array("1a", "2",  "10")
sort(array("1a", "10", "2" )) => array("2",  "10", "1a")
sort(array("1a", "2",  "10")) => array("1a", "2",  "10")
sort(array("2",  "10", "1a")) => array("2",  "10", "1a")
sort(array("2",  "1a", "10")) => array("10", "1a", "2" )

1
이전 댓글은 내가
그동안

이제 제거했습니다.) 그리고 멋진 새 sort()테이블은 관련 블로그 게시물 The Greatest PHP Value를 작성할 때 실제적인 의미를 위해 선택했습니다 . 답변 해 주셔서 다시 한 번 감사드립니다.
hakre

usort가능할 때마다 사용해야한다는 뜻 입니까?
Voitcus

2
@Voitcus : 당신이 의미하는 것 같아요 usort($arr, 'strcmp'). 이것은 (물론 문자열의 경우) 작동하지만 sort($arr, SORT_STRING).
Walter Tross 2013

@WalterTross I 평균 항상 항상 올바른지 확인하기 위해 (뿐만 아니라 문자열에 대한) 자신의 기능을 사용
Voitcus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.