복붙노트

왜 PHP는 문자열을 0으로 간주합니까?

PHP

왜 PHP는 문자열을 0으로 간주합니까?

나는 다음과 같은 코드를 가지고있다.

$item['price'] = 0;
/*code to get item information goes in here*/
if($item['price'] == 'e') {
    $item['price'] = -1;
}

항목 가격을 0으로 초기화 한 다음 이에 대한 정보를 얻으려고합니다. 가격이 'e'로 통보되면 판매 대신 교환을 의미하며, 숫자 값이 필요한 데이터베이스에 저장되기 때문에 음수로 표시됩니다.

아이템이 보너스이거나 가격이 나중에 설정되기 때문에 가격을 0으로 남겨 둘 가능성도 있습니다.

그러나 가격이 설정되지 않은 경우에는 항상 초기 값 0으로 유지되고 위에 표시된 if 루프는 true로 평가되고 가격은 -1로 설정됩니다. 즉, 0은 'e'와 같다고 간주합니다.

어떻게 설명 할 수 있습니까?

편집하다: 가격이 초기화 후 0으로 제공되면 동작이 이상합니다. 때때로 if가 true로 평가되고 false로 평가되는 경우가 있습니다.

해결법

  1. ==============================

    1.당신은 == 당신을 위해 타입을 정렬하고 있습니다.

    당신은 == 당신을 위해 타입을 정렬하고 있습니다.

    0은 int이므로이 경우에는 'e'를 int로 캐스트합니다. 1로 해석 할 수없고 0이됩니다. 문자열 '0e'는 0이되어 일치합니다!

    사용 ===

  2. ==============================

    2.이것은 PHP가 == 비교 연산자가 나타내는 비교 연산을 수행하는 방법 때문입니다 :

    이것은 PHP가 == 비교 연산자가 나타내는 비교 연산을 수행하는 방법 때문입니다 :

    첫 번째 피연산자는 숫자 (0)이고 두 번째 피연산자는 문자열 ( 'e')이므로 문자열도 숫자로 변환됩니다 (다양한 유형의 테이블 비교 참조). 문자열 데이터 형식에 대한 매뉴얼 페이지는 문자열을 숫자로 변환하는 방법을 정의했습니다.

    이 경우 문자열은 'e'이므로 float로 평가됩니다.

    'e'는 유효한 숫자 데이터로 시작하지 않으므로 float 0으로 평가됩니다.

  3. ==============================

    3.문제는 double equal 연산자입니다. 그러면 오른쪽 멤버를 왼쪽에 유형 변환합니다. 원하는 경우 strict를 사용하십시오.

    문제는 double equal 연산자입니다. 그러면 오른쪽 멤버를 왼쪽에 유형 변환합니다. 원하는 경우 strict를 사용하십시오.

    if($item['price'] == 'e') {
        $item['price'] = -1;
    }
    

    코드로 돌아 가자 (위 복사). 이 경우 대부분의 경우 $ item [ 'price']는 정수입니다 (e와 같을 때는 제외). PHP의 법칙에 따라 PHP는 "e"를 정수로 변환하여 int (0)을 생성합니다. (나를 믿지 않습니까? ).

    쉽게이 문제로부터 벗어나려면 유형을 검사하고 암시 적으로 유형 변환하지 않는 3 배 균등 (정확한 비교) 연산자를 사용하십시오.

    P.S : PHP 재미있는 사실 : a == b는 b == a를 의미하지 않습니다. 예를 들어 반대로 : $ item [ 'price']가 항상 정수인 경우 if ( "e"== $ item [ 'price'])는 실제로 수행되지 않습니다.

  4. ==============================

    4.== 연산자는 다른 유형 인 경우에도 값을 일치 시키려고 시도합니다. 예를 들면 :

    == 연산자는 다른 유형 인 경우에도 값을 일치 시키려고 시도합니다. 예를 들면 :

    '0' == 0 will be true
    

    형식 비교가 필요할 경우 === 연산자를 사용하십시오.

    '0' === 0 will be false
    
  5. ==============================

    5.

    "ABC" == 0
    

    "ABC"가 정수로 변환되어 0이되기 때문에 true를 평가하고 0과 비교합니다.

    이것은 PHP 언어의 이상한 행동입니다. 일반적으로 0은 문자열 "0"으로 승격되고 "false"는 "ABC"와 비교됩니다. JavaScript와 같은 다른 언어에서 발생하는 약한 비교 인 "ABC"== 0은 false를 평가합니다.

    엄격한 비교를 수행하면 문제가 해결됩니다.

    "ABC" === 0
    

    거짓을 평가합니다.

    그러나 숫자를 숫자와 문자열로 비교해야한다면 어떻게해야할까요?

    "123" === 123
    

    왼쪽과 오른쪽 용어가 다른 유형이기 때문에 false를 평가합니다.

    실제로 필요한 것은 PHP 유형 저글링의 함정이없는 약한 비교입니다.

    해결책은 용어를 문자열로 명시 적으로 승격 한 다음 비교를 수행하는 것입니다 (엄격하거나 약한 것은 더 이상 중요하지 않음).

    (string)"123" === (string)123
    

    ~이다.

    참된

    동안

    (string)"123" === (string)0
    

    ~이다.

    그릇된

    원래 코드에 적용 :

    $item['price'] = 0;
    /*code to get item information goes in here*/
    if((string)$item['price'] == 'e') {
        $item['price'] = -1;
    }
    
  6. ==============================

    6.PHP에서는 "0", "false", "off"== false, "1", "on", "true"== true를 종종 간과하기 때문에 유효합니다. GET / POST 인수를 구문 분석 할 때 특히 유용합니다.

    PHP에서는 "0", "false", "off"== false, "1", "on", "true"== true를 종종 간과하기 때문에 유효합니다. GET / POST 인수를 구문 분석 할 때 특히 유용합니다.

    filter_var( $item['price'], FILTER_VALIDATE_BOOLEAN );
    

    이것은 유스 케이스와 관련이 없지만 유사성과 사실을 감안할 때 결과 검색은 false (문자열) "0"의 유효성을 검사하는 질문에 거짓이 있다고 생각할 때 다른 사람들에게 도움이 될 것이라고 생각하는 경향이 있습니다.

    http://www.php.net/manual/en/filter.filters.validate.php

  7. ==============================

    7.일반 연산자는 형식을 비교하지 않기 때문에 == 대신 ===를 사용해야합니다. 대신 항목을 유형 변환하려고 시도합니다.

    일반 연산자는 형식을 비교하지 않기 때문에 == 대신 ===를 사용해야합니다. 대신 항목을 유형 변환하려고 시도합니다.

    한편, === 항목의 유형을 고려합니다.

  8. from https://stackoverflow.com/questions/6843030/why-does-php-consider-0-to-be-equal-to-a-string by cc-by-sa and MIT license