다음 코드가 있습니다.
$item['price'] = 0;
/* Code to get item information goes in here */
if($item['price'] == 'e') {
$item['price'] = -1;
}
아이템 가격을 0으로 초기화 한 다음 이에 대한 정보를 얻기위한 것입니다. 가격이 ‘e’로 표시되면 판매가 아닌 교환을 의미하며 데이터베이스에 음수로 저장됩니다.
아이템이 보너스이거나 나중에 가격이 설정되기 때문에 가격을 0으로 둘 가능성도 있습니다.
그러나 가격이 설정되지 않고 초기 값이 0으로 남을 때마다 if
위에 표시된 루프는 참으로 평가되고 가격은 -1로 설정됩니다. 즉, 0을 ‘e’로 간주합니다.
어떻게 설명 할 수 있습니까?
가격이 0 (초기화 후)으로 제공되면 동작이 불규칙합니다. 경우에 따라 if가 true로 평가되고 때로는 false로 평가됩니다. *
답변
당신은 당신 ==
을 위해 유형을 분류하는 것을하고 있습니다.
0
은 int이므로이 경우 'e'
에는 int 로 캐스트 됩니다. 하나로 구문 분석 할 수 없으며 0
. 문자열 '0e'
이되고 0
일치합니다!
사용하다 ===
답변
이것은 PHP가 ==
비교 연산자가 나타내는 비교 연산을 수행하는 방식 때문입니다 .
숫자를 문자열과 비교하거나 비교에 숫자 문자열이 포함 된 경우 각 문자열이 숫자로 변환되고 비교가 숫자로 수행됩니다. […] 유형 변환은 비교 일 때
===
또는!==
값뿐만 아니라 유형을 비교하는 것을 포함하기 때문에 발생하지 않습니다 .
첫 번째 피연산자는 숫자 ( 0
)이고 두 번째 피연산자는 문자열 ( 'e'
)이므로 문자열도 숫자로 변환됩니다 ( 다양한 유형과의 비교 표 참조 ). 문자열 데이터 유형에 대한 매뉴얼 페이지는 문자열을 숫자로 변환 하는 방법을 정의 했습니다.
숫자 컨텍스트에서 문자열을 평가할 때 결과 값과 유형은 다음과 같이 결정됩니다.
문자열에 ‘
.
‘, ‘e
‘또는 ‘E
‘ 문자가 포함되어 있지 않고 숫자 값이 정수 유형 제한 (에서 정의 됨PHP_INT_MAX
)에 맞으면 문자열이 정수로 평가됩니다. 다른 모든 경우에는 부동 소수점으로 평가됩니다.
이 경우 문자열은 'e'
이므로 float로 평가됩니다.
값은 문자열의 초기 부분으로 제공됩니다. 문자열이 유효한 숫자 데이터로 시작하는 경우이 값이 사용됩니다. 그렇지 않으면 값은
0
(영)이됩니다. 유효한 숫자 데이터는 선택적 부호, 하나 이상의 숫자 (선택적으로 소수점 포함), 선택적 지수입니다. 지수는 ‘e
‘또는 ‘E
‘뒤에 하나 이상의 숫자가 있습니다.
으로 'e'
유효한 숫자 데이터로 시작하지 않는, 그것은 떠 평가합니다 0
.
답변
"ABC" == 0
첫 번째 는 정수로 변환되고 다음 이 true
되기 때문에 평가 됩니다 . "ABC"
0
0
이것은 PHP 언어 의 이상한 동작입니다. 일반적으로 0
문자열로 승격 된 "0"
다음 "ABC"
결과와 비교됩니다 false
. 아마도 그것은 약한 비교가 "ABC" == 0
평가 되는 JavaScript와 같은 다른 언어에서 일어나는 일입니다 false
.
엄격한 비교를 수행하면 문제가 해결됩니다.
"ABC" === 0
평가 false
합니다.
하지만 숫자를 숫자와 문자열로 비교해야한다면 어떻게해야할까요?
"123" === 123
false
왼쪽 및 오른쪽 항이 다른 유형이기 때문에 평가 됩니다.
실제로 필요한 것은 PHP 유형 저글링의 함정이없는 약한 비교입니다.
해결책은 용어를 문자열로 명시 적으로 승격 한 다음 비교를 수행하는 것입니다 (엄격하거나 약한 것은 더 이상 중요하지 않음).
(string)"123" === (string)123
이다
true
동안
(string)"123" === (string)0
이다
false
원래 코드에 적용 :
$item['price'] = 0;
/*code to get item information goes in here*/
if((string)$item['price'] == 'e') {
$item['price'] = -1;
}
답변
== 연산자는 유형이 다른 경우에도 값을 일치 시키려고합니다. 예를 들면 :
'0' == 0 will be true
유형 비교도 필요하면 === 연산자를 사용하십시오.
'0' === 0 will be false
답변
문제는 이중 등호 연산자로 오른쪽 멤버를 왼쪽 유형으로 형변환합니다. 원하는 경우 엄격을 사용하십시오.
if($item['price'] == 'e') {
$item['price'] = -1;
}
코드 (위에서 복사)로 돌아가 보겠습니다. 이 경우 대부분의 경우 $ item [ ‘price’]는 정수입니다 (분명히 e와 같은 경우는 제외). 따라서 PHP의 법칙에 따라 PHP는 "e"
정수로 형변환 하여 int(0)
. (나를 믿지 않습니까? <?php $i="e"; echo (int)$i; ?>
).
이를 쉽게 피하려면 유형을 확인하고 암시 적으로 형변환하지 않는 삼중 같음 (정확한 비교) 연산자를 사용하십시오.
추신 : PHP 재미있는 사실 : a == b
그것을 암시하지 않습니다 b == a
. 예를 들어 뒤집어보십시오. if ("e" == $item['price'])
$ item [ ‘price’]가 항상 정수이면 실제로는 이행되지 않습니다.
답변
PHP에는 “0”, “false”, “off”를 == false로, “1”, “on”, “true”를 == true로 혼합하여 확인하는 편리한 방법이 있습니다. GET / POST 인수를 구문 분석하는 데 특히 유용합니다.
filter_var( $item['price'], FILTER_VALIDATE_BOOLEAN );
이 사용 사례와는 전혀 관련이 없지만 유사성과 사실을 감안할 때 (문자열) “0”을 거짓으로 검증하는 질문을 할 때 검색 결과가 검색되는 경향이 있습니다. 다른 사람에게 도움이 될 것이라고 생각했습니다.
답변
===
대신 사용해야 합니다==
일반 연산자는 유형을 비교하지 않으므로 . 대신 항목을 형변환하려고 시도합니다.
한편 ===
고려 항목 유형을 고려합니다.
===
“같음”을 의미하고==
뜻은 “eeeeh .. 닮았 어”