2012-05-14 7 views
2

나는이 다음 코드 :PHP 타입 캐스트 혼란

<?php 
    $val = 0; 
    $res = $val == 'true'; 

    var_dump($res); 
?> 

난 항상 PHP는 캐스트 $의 발 부울 유형을 입력하려고 할 것입니다 위의 표현으로 $ 입술 'false'로해야한다는 인상이었다 (0은 거짓으로 변환 됨) 및 문자열 (비어 있지 않은 문자열은 참). 그러나 위 코드를 실행하면 다음과 같이 출력됩니다.

boolean true 

내가 누락 된 것이 있습니까? 감사.

+0

문자열을보십시오, 여기에 또 다른 예이다 : ' ' 여전히 $ res -> true입니다. – user1393876

답변

3

PHP에서 비어 있지 않은 숫자가 아닌 문자열은 모두 0으로 계산되므로 0 == 'true'은 TRUE이지만 0 === 'true'은 FALSE입니다. true 문자열은 부울 값으로 변환되지 않았지만 문자열과을 0으로 비교합니다. 0은 부울 값으로 캐스팅되지 않고 int 값으로 남습니다. 그래서 궁극적으로 당신이 얻을 :

// string 'true' casts to int 0 
0 == 0 // true 

이 시도 :

echo intval('true'); 
// 0 
echo intval('some arbitrary non-numeric string'); 
// 0 

검토 the PHP type comparisons table합니다. 일반적으로 PHP에서 부울 비교를 수행 할 때 유형이 동일하지 않은 경우 (이 경우 문자열을 int로 사용) 엄격한 비교를 사용하는 것이 중요합니다.

+0

고마워,이게 === 연산자 결과가 거짓 일 것이 분명하지만 0은 int이다. 이벤트 유형은'$ res = (int) $ val == (string) 'true';'와' 결과는 여전히 TRUE가됩니다. – user1393876

+0

@ user1393876 맞습니다. 'intval ('true')'을 실행하면 무엇을 얻는 지 알 수 있습니다. –

+0

죄송합니다. 제 질문을 좀 더 명확하게하기 위해 다른 예제를 추가했습니다. 올바른 피연산자가 'true'여야한다는 의미는 아니 었습니다. PHP가 문자열을 정수 0 (제로)과 비교하면 결과는 true입니다. – user1393876

0

$val이 첫 번째 연산자이기 때문에 PHP는 문자열 true을 0이되는 정수로 변환합니다. 결과는 0 == 0이고 결과는 참입니다.

+0

답장을 보내 주셔서 감사합니다. 따라서 로직에서 오는 해석기가 두 번째 피연산자의 형식을 첫 번째 피연산자의 형식으로 변환하겠습니까? 그러나 피연산자를 변경하더라도 결과는 여전히 참입니다. '' – user1393876

0

아마 조금 혼란 '사실'이

<?php 
    $val = 1; 
    $res = (bool)$val == 'true'; 

    var_dump($res); 
?>