programing

PHP의 유형 조정 및 (엄격한) 크기/낮은 비교

firstcheck 2022. 10. 29. 14:34
반응형

PHP의 유형 조정 및 (엄격한) 크기/낮은 비교

PHP는 활자 잡기로 유명하다.솔직히 말해서, 기본적인 논리적/근본적인 것을 비교하는 데 어려움을 겪고 있습니다.

예를 들어 다음과 같습니다. if$a > $b 및 "true" 입니다.$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)
    

    </FONT CHANGE:>와 관련된 과 같습니다.NAN 있다false는 PHP 고유의 것이 아닙니다.이것은 IEEE 754 부동 소수점 산술 표준(자세한 정보)에 의해 규정되어 있습니다.

  • PHP†==연산자는 대칭입니다.$a == $b ★★★★★★★★★★★★★★★★★」$b == $a항상 똑같아요.

  • PHP†==연산자는 타동적이지 않습니다(예: from).$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항상 참인 것은 아닙니다(예:==를 참조해 주세요.

  • PHP†<=연산자가 안티바이러스(예: from)가 아닙니다.$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: (::==를 참조해 주세요.

  • PHP php : PHP<=연산자가 완전하지 않다. 즉, 둘 다$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 < INF에 대한 평가입니다.true.

  • PHP†<연산자는 비대칭이 아닙니다. 즉,$a < $b가 맞지 않다!($b < $a): (::<=반독점주의자가 아니다.)

  • PHP†<연산자는 타동적이지 않습니다(예: from).$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 php : PHP<연산자는 trichotomous가 아닙니다. 즉, 모든 연산자는$a < $b,$b < $a ★★★★★★★★★★★★★★★★★」$a == $bfalse일 수 (false의 ).<=완전하지 않다).

  • PHP php : 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)
    

    주의: 위의 예에서는 "Object of class stdClass cannot be converted to double" 알림을 보냅니다.

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

마지막으로 PHP가 보증하는 평등은 두 가지가 있다는 것을 지적하고 싶습니다(다른 거의 모든 것과 달리).컴파일러가 다른 컴파일러로 줄인다는 이유만으로 이들 2개는 항상 유지됩니다.

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

엄밀하게 동일한 비교 연산자는 없습니다(>== ""<==(적어도 PHP 5.6.14에 의한) PHP에서는 Greater/Lower를 체크하기 전에 엄격한 타입 체크를 실시하는 방법이 몇 가지 있습니다.

  1. 유형을 모두 확인하세요.if (gettype($a) === gettype($b))
  2. 필요한 타입 캐스트를 강제합니다(예: if ((string)$a === (string)$b)
  3. 필요한 활자를 강제로 맞춥니다(예: if (($a . '') === ($b . ''))

주의:

  • 부동 소수점 정밀도가 제한됩니다.
  • INF ★★★★★★★★★★★★★★★★★」NAN are 입니다.float 754 이하
  • 일부 Infinity는 다른 Infinity와 동일합니다(PHP 5.4 이후).
  • 표기법e float, never, neverinteger
  • 「」를 。PHP_INT_MAX float
  • "Floats of the system" ( 경계에 플로팅)이 됩니다.INF
  • 되지 않은 및입니다.NULL
  • 에 ''가 붙는 0
  • 가 " " "인 하는 변환 0 선두를 정수화하다0

이색 비교 목록:

매우 이상합니다.
$a VS$b $a>$b $a<$b $a>=$b $a==$b $a==$bfloat(NAN) float(-INF) false false false false falsefloat(NAN) flow(0) false false false false false falsefloat(NAN) flow(1) false false false false false falsefloat(NAN) flow(INF) false false false false false falsefloat(NAN) false false false false false false falsefloat(NAN) int(-1) false false false false falsefloat(NAN) int(0) false false false false false falsefloat(NAN) int(1) false false false false false false

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

$a VS$b $a>$b $a<$b $a>=$b $a==$b $a==$b
NULL(NULL) array() false true true falseNULL(NULL) bool(false) false true true true falseNULL(NULL) float(0) false true true true falseNULL(NULL) int(0) false true true true falseNULL(NULL) str("") false true true true falsearray() bool(false) false true true true falsebool(false) float(0) false false 참 참 참 참 거짓bool(false) int(0) false false true true true falsestr(') bool(false) false true true true falsebool(false) str'0') false false true true true falsefloat(-INF) bool(true) false true true true falsebool(true) float(1) false false true true true falsefloat(INF) bool(true) false true true true falsefloat(NAN) bool(true) false 진실 진실 진실 거짓bool(true) int11) false true true true falsebool(true) int(1) false false true true true falsebool(true) str("\0") false true true true falsebool(true) str('+' false true true true falsebool ( true ) str') -' false true true true falsebool(true) str(01') false true true true falsebool(true) str(1') false true true true falsebool(true) str'false') false true true true falsestr'text') bool(true) false false true true falsestr'true') bool (true) false false true true true false    int(0) float(0) false true true true false  str4\0") float(0) false false true true true false   str(') float(0) false true true true false   str4+' float(0) false true true true false   str4-' float(0) false true true true false   str '0') float(0) false false true true true false str'false') float(0) false false true true false str'text') float(0) false false true true false str'true') float(0) false false true true false    int(1) float(1) false true true true false   float(1) str '01' false true true true false   float(1) str'1') false false true true true false  str4\0") int(0) false false true true true false   str(') int(0) false true true true false   str4+' int(0) false true true true false   str4-' int(0) false true true true false    int(0) str '0') false true true true false str'false') int(0) false false true true true false str'text') int(0) false false true true true false str'true') int(0) false false true true true false    int(1) str '01' false true true true false    int(1) str'1') false false true true true false   str'1') str'01') false true true true false

더 낮으면서도 더 크다고요?

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

동일 및 동일:

$a VS$b $a>$b $a<$b $a>=$b $a==$b $a==$bNULL(NULL) NULL(NULL) False True True True(NULL)float(-INF) false true true(-INF) false true true truefloat(INF) false 참 참 참 참 참 참 참

낮음 또는 높음:

$a VS$b $a>$b $a<$b $a>=$b $a==$b $a==$b
NULL(NULL) bool(true) false true false false(true)float(-INF) NULL(NULL) true false true false falseNULL(NULL) float(1) false 참 참 거짓 거짓float(INF) NULL(NULL) true false true false falsefloat(NAN) NULL(NULL) true false true false falseNULL(NULL) int(-1) false true false falseNULL(NULL) int(1) false true false false falseNULL(NULL) str("\0") false true false falseNULL(NULL) str('+') false True false falseNULL(NULL) str('-') false True false falseNULL(NULL) str('0') false true false falseNULL(NULL) str('01') false true false falseNULL(NULL) str('1') false true false falseNULL(NULL) str('false') false true false falseNULL(NULL) str('text') false True false falseNULL(NULL) str('true') false true false false   array() bool(true) false true false false float(-INF) array() false true false false   array() float(0) true false true false false   array() float(1) true false true false false  float(INF) array() false true false false  float(NAN) array() false true false false   array() int'1) true false false true false   array() int(0) true false false true false   array() int(1) true false false true false   array() strg\0") true false false true false false   str(') array() false true false false   array() str4+' true false true false false   array() str--' true false true false false   array() str '0') true false true false false   array() str '01') true false false true false f   array() str'1') true false false true false   array() str'false') true false true false false   array() str'text') true false true false false   array() str 'true') true false false true falsebool(진짜) bool(진짜) 진짜 false false false falsefloat(-INF) bool(false) true false true false falsefloat(1) bool(false) true false false true false falsefloat(INF) bool(false) true false true false falsefloat(NAN) bool(false) true false false 진짜 falsebool(false) int11) false true false false falseint(1) bool(false) true false false true false falsebool(false) str\\0") false true false falsebool(false) str++' false true false false falsebool(false) str--' false true false false falsebool(false) str(01') false true false false falsestr11') bool(false) true false false false falsebool (false) str'false') false 진실 거짓 거짓 거짓str'text') bool(false) true false true false falsestr'true') bool (false) true false false false falsebool(true) float(0) true false false false falsebool(true) int(0) true false false false false falsestr(') bool(true) false true false falsebool(true) str('0') true false false false false falsefloat(-INF) float(0) false true falsefloat(-INF) float(1) false true false falsefloat(INF) float(-INF) true false true false falsefloat(-INF) int(-1) false 참 참 거짓 거짓float(-INF) int(0) false true false falsefloat(-INF) int(1) false true false falsefloat(-INF) str("\0") false true false falsefloat(-INF) str("") false true false falsefloat(-INF) str('+') false true false falsefloat(-INF) str('-') false true false falsefloat(-INF) str('0') false true false falsefloat(-INF) str('01') false true false falsefloat(-INF) str('1') false true false falsefloat(-INF) str('false') false true false falsefloat(-INF) str('text') false true false falsefloat(-INF) str('true') false true false falsefloat(1) float(0) true false true false falsefloat(INF) float(0) true false true false falsefloat(0) int(1) true false false true false falseint(1) float(0) true false false true falsefloat(0) str '01' false true false falsestr'1') float(0) true false false true falsefloat(INF) float(1) true false true false falsefloat(1) int(1) true false false true false falsefloat(1) int(0) true false false true falsefloat(1) str\0") true false false true false falsestr(') float(1) false true false falsefloat(1) str4+' true false false true false falsefloat(1) str'-' true false false true false falsefloat(1) str '0') true false false true false falsefloat(1) str'false') true false false false falsestr'text') float(1) false true false falsestr'true') float(1) false true true false falsefloat(INF) int(-1) true false false true falsefloat(INF) int(0) true false false true falsefloat(INF) int(1) true false false true false falsefloat(INF) str("\0") true false true false falsefloat(INF) str("") true false true false falsefloat(INF) str('+') true false true false falsefloat(INF) str('-') true false true false falsefloat(INF) str('0') true false true false falsefloat(INF) str('01') true false true false falsefloat(INF) str('1') true false true false falsefloat(INF) str('false') true false true false falsefloat(INF) str('text') true false true false falsefloat(INF) str('true') true false true false falseint(0) int(1) true false false true false falseint(1) int(1) true false false true false falsestr'\0') int'1) true false false true false falsestr(') int'1) true false false true false falsestr'+' int'1) true false false true falsestr'-' int'1) true false false true falsestr'0') int'1) true false false true false falseint'1) str'01') false true false falsestr'1') int'1) true false false true false falsestr'false') int'1) true false false true false falsestr'text') int'1) true false false true false falsestr'true') int'1) true false false false falseint(1) int(0) true false false true falseint(0) str '01' false true false falsestr'1') int(0) true false false false falseint(1) str\0") true false false true false falsestr(') int(1) false true false falseint(1) str+' true false false true false falseint(1) str'-' true false false true false falseint(1) str'0') true false false true false falseint(1) str'false') true false false true false false str'text') int(1) false true false falsestr'true') int(1) false true false falsestr(') str(\0") false true true false falsestr4+' str'\0") true false false true falsestr'-' str'\0') true false false true falsestr'\0') str'0') false true false falsestr'\0') str '01') false true false falsestr'1') str'\0') true false false true false falsestr'false') str'\0') true false false true false falsestr'text') str'\0') true false false true false falsestr'true') str'\0') true false false true false falsestr(') str(+') false true true false falsestr(') str'-' false true false falsestr(') str'0') false true false falsestr(') str '01') false true false falsestr(') str'1') false true false falsestr(') str'false') false true false falsestr(') str'text') false true false falsestr(') str'true') false true false false false   str' -' str' +' true false false true false falsestr'+' str'0') false true false falsestr'+' str'01') false true false falsestr'1') str'+' true false false true false falsestr'false') str'+' true false true false falsestr'text') str'+' true false false true false falsestr'true') str'+' true false false true false falsestr'-' str'0') false true false falsestr'-' str'01') false true false falsestr'1') str'-' true false false true false falsestr'false') str'-' true false true false false'str'text') str'-' true false false true false'str'true') str'-' true false false false false'str '0') str '01') false true true false falsestr'1') str'0') true false false true false falsestr'false') str'0') true false true false falsestr'text') str'0') true false false true false falsestr'true') str'0') true false false true false falsestr 'false') str '01') true false false false falsestr'text') str'01') true false false true false falsestr'true') str '01') true false false false falsestr('1') str('false) false true false falsestr'text') str'1') true false false true false falsestr'true') str'1') true false false true false false str'text') str'false') true false false false false str'true') str'false') true false false false falsestr'true') str'text') true false false true false false

$a > $b > $c ★★★★★★★★★★★★★★★★」$a하 is 。$c.

A&ltC : float(NAN) > str('a') > str('')'A&ltC : float(NAN) > str('a') > str('1')A&ltC : float(NAN) > str('a') > str('A')A&ltC : float(NAN) > str('a') > str('0')A&ltC : float(NAN) > str('1') > str('')'A&ltC : float(NAN) > str('1') > str('0')A&ltC : float(NAN) > str('A') > str('')'A&ltC : float(NAN) > str('A') > str('1')A&ltC : float(NAN) > str('A') > str('0')A&ltC : float(NAN) > str('0') > str('')A&ltC : str(') > float(NAN) > str('a')A&ltC : str(') > float(NAN) > str('1')A&ltC : str(') > float(NAN) > str('A')A&ltC : str(') > float(NAN) > str('0')A&ltC : str('a')> str(''')> float(NAN)A&ltC : str('a') > str('1') > float(NAN)A&ltC : str('a') > str('A') > float(NAN)A&ltC : str('a') > str('0') > float(NAN)A&ltC : str('0')> str(''')> float(NAN)A==C : bool(true) > str('') > float(NAN)A==C: bool(true)> str('')> float(-INF)A==C: bool(true)> str('')> int11)A==C : bool(true) > str('') > float11)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 1A==C: bool(true)> int(0)> float(-INF)A==C: bool(true)> int(0)> int(-1)A==C : bool(true) > int(0) > float11)A==C : bool(참) > str('0') > float(NAN)A==C : bool(true) > str00') > float(-INF)A==C: bool(true)> str('0')> int11)A==C : bool(참) > str('0') > float11)A==C : bool(true) > float(0) > float(-INF)A==C : bool(true) > float(0) > int11)A==C : bool(true) > float(0) > float11)A==C : int (1) > straa') > str11')A==C : int (1) > str('A') > str '1')A==C : float(1) > straa') > str11')A==C : float (1) > str('A') > str '1')A==C : straa') > str'1') > int(0)A==C : straa') > str11') > float(0)A==C : str(') > float(-INF) > NULL(NULL)A==C : str(') > float(-INF) > bool(false)A==C : str(') > int11) > NULL(NULL)A==C : str(') > int11) > bool(false)A==C : str(') > float11) > NULL(NULL)A==C : str(') > float11) > 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() > straa' > NULL(NULL)A==C : array() > straa' > 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() > str11' > NULL(NULL)A==C : array() > str11' > bool(false)A==C : array() > str('A') > NULL(NULL)A==C : array() > str('A') > bool(false)A==C : array() > str00' > NULL(NULL)A==C : array() > int11) > NULL(NULL)A==C : array() > int11)> bool(false)A==C : array() > float11) > NULL(NULL)A==C : array() > float11) > 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) > int11) > NULL(NULL)A==C : int(0) > int11) > bool(false)A==C : int(0) > float11) > NULL(NULL)A==C : int(0) > float11) > bool(false)A==C : str00') > float(NAN) > bool(false)A==C : str00') > float(-INF) > bool(false)A==C : str00' > int11) > bool (false)A==C : str00') > float)1) > bool(false)A==C : float(0) > float(-INF) > NULL(NULL)A==C : float(0) > float(-INF) > bool(false)A==C : float(0) > int11) > NULL(NULL)A==C : float(0) > int11) > bool(false)A==C : float(0) > float11) > NULL(NULL)A==C : float(0) > float11) > bool(false)A===C : str00') > float(NAN) > str('0')A===C : str(') > float(NAN) > str('')A===C : straa') > float(NAN) > straa')A===C : str11') > float(NAN) > str11')A===C : str('A') > float(NAN) > str('A')

문자열 ' 재 ' ' : 'Queen'>' '왕'>>'

쌍을 포함하는 PHP 유형 비교 표도 확인하십시오.

  • isset() ★★★★★★★★★★★★★★★★★」is_null()
  • if() ★★★★★★★★★★★★★★★★★」empty()
  • == ★★===

라이브 PHP 버전 간의 차이를 확인합니다.http://3v4l.org/MAfDu 를 참조해 주세요.

당신이 질문의 두 번째 부분을 수정한 후, 저는 그 부분에 대한 답을 다른 사람들에게 맡깁니다.첫 즉 '예가, '예'가 있는지, '예'가 있는지, '예'가 있는지, '예가 있는지, '예'가 있는지, '예'가 있다, '예'가 있다, '예'가 있다, '예'가 있다, '예'라는죠.< ★★★★★★★★★★★★★★★★★」>연산자가 자동적입니다.여기 있어요.

다 있다true:

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

if<transitive)이었다.$a < $b$b < $c$a < $c은 )입니다

"10" < "2"

그러나 PHP는 친절하게(!) 문자열을 숫자로 해석하려고 합니다.

it it it it it it it it it it it it it가 되었습니다.sort()는, 2개의 요소가 없는 경우(및 요소가 NAN이 아닌 경우)에서도, 입력 순서에 따라 같은 요소를 다른 순서로 정렬할 수 있습니다.이것을 정리하기 위해서 코멘트로 지적했습니다.그 요점은 다음과 같습니다.

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" )

언급URL : https://stackoverflow.com/questions/15813490/type-juggling-and-strict-greater-lesser-than-comparisons-in-php

반응형