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

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)

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



답변

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)


답변

없습니다 엄격한 동일한 비교 연산자 ( >==또는 <==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 .


답변

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

모두 다음과 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" )


답변