왜 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.당신은 == 당신을 위해 타입을 정렬하고 있습니다.
당신은 == 당신을 위해 타입을 정렬하고 있습니다.
0은 int이므로이 경우에는 'e'를 int로 캐스트합니다. 1로 해석 할 수없고 0이됩니다. 문자열 '0e'는 0이되어 일치합니다!
사용 ===
-
==============================
2.이것은 PHP가 == 비교 연산자가 나타내는 비교 연산을 수행하는 방법 때문입니다 :
이것은 PHP가 == 비교 연산자가 나타내는 비교 연산을 수행하는 방법 때문입니다 :
첫 번째 피연산자는 숫자 (0)이고 두 번째 피연산자는 문자열 ( 'e')이므로 문자열도 숫자로 변환됩니다 (다양한 유형의 테이블 비교 참조). 문자열 데이터 형식에 대한 매뉴얼 페이지는 문자열을 숫자로 변환하는 방법을 정의했습니다.
이 경우 문자열은 'e'이므로 float로 평가됩니다.
'e'는 유효한 숫자 데이터로 시작하지 않으므로 float 0으로 평가됩니다.
-
==============================
3.문제는 double equal 연산자입니다. 그러면 오른쪽 멤버를 왼쪽에 유형 변환합니다. 원하는 경우 strict를 사용하십시오.
문제는 double equal 연산자입니다. 그러면 오른쪽 멤버를 왼쪽에 유형 변환합니다. 원하는 경우 strict를 사용하십시오.
if($item['price'] == 'e') { $item['price'] = -1; }
코드로 돌아 가자 (위 복사). 이 경우 대부분의 경우 $ item [ 'price']는 정수입니다 (e와 같을 때는 제외). PHP의 법칙에 따라 PHP는 "e"를 정수로 변환하여 int (0)을 생성합니다. (나를 믿지 않습니까? php $ i = "e"; echo (int) $ i;?>).
쉽게이 문제로부터 벗어나려면 유형을 검사하고 암시 적으로 유형 변환하지 않는 3 배 균등 (정확한 비교) 연산자를 사용하십시오.
P.S : PHP 재미있는 사실 : a == b는 b == a를 의미하지 않습니다. 예를 들어 반대로 : $ item [ 'price']가 항상 정수인 경우 if ( "e"== $ item [ 'price'])는 실제로 수행되지 않습니다.
-
==============================
4.== 연산자는 다른 유형 인 경우에도 값을 일치 시키려고 시도합니다. 예를 들면 :
== 연산자는 다른 유형 인 경우에도 값을 일치 시키려고 시도합니다. 예를 들면 :
'0' == 0 will be true
형식 비교가 필요할 경우 === 연산자를 사용하십시오.
'0' === 0 will be false
-
==============================
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.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.일반 연산자는 형식을 비교하지 않기 때문에 == 대신 ===를 사용해야합니다. 대신 항목을 유형 변환하려고 시도합니다.
일반 연산자는 형식을 비교하지 않기 때문에 == 대신 ===를 사용해야합니다. 대신 항목을 유형 변환하려고 시도합니다.
한편, === 항목의 유형을 고려합니다.
from https://stackoverflow.com/questions/6843030/why-does-php-consider-0-to-be-equal-to-a-string by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
PHP 세션이 이미 시작되었는지 확인하십시오. (0) | 2018.09.06 |
---|---|
htmlspecialchars와 mysql_real_escape_string은 PHP 코드를 주입으로부터 안전하게 유지합니까? (0) | 2018.09.06 |
PHP에서 수레 비교 (0) | 2018.09.06 |
PHP에 대한 각도 HTTP 게시 및 정의되지 않음 (0) | 2018.09.06 |
파일을 다운로드하지 않고 원격 파일 크기 (0) | 2018.09.06 |