PHP 비교연산자는 다음과 같은 결과가 나온다.
0 == '-' // TRUE
0 === '-' // FALSE
'0' == '-' // FALSE
제일 처음에 있는 숫자 0 과 문자/문자열을 비교하는 부분이 TRUE가 나오는게 예상 밖이다.
숫자 0 과 문자 혹은 문자열을 == 으로 비교할 때 PHP가 문자/문자열을 0 으로 타입캐스팅 해버리는 게 궁극적인 문제이다.
과정을 설명하자면 다음과 같다.
// 아래 문장을 만나면
0 == '-'
// PHP는 아래처럼 내부적으로 타입캐스팅을 하고,
0 == (int)'-'
// PHP는 숫자가 아닌 문자는 전부 0 으로 타입캐스팅을 하므로 아래처럼 숫자0과 숫자0의 비교를 하게되고
0 == 0
// 결과적으로 0 == '-' 은 TRUE가 된다.
비교구문의 변수에 숫자 0 이 절대 안들어간다는 보장이 있으면 모르겠는데,
그게 아닐 경우에는 왠만하면 타입까지 전부 비교하는 === 을 사용하는 쪽으로 가닥을 잡는 수 밖에는 없을 듯 하다.
예전에 올렸던 포스팅과 결국은 같은 문제이다.
http://bloodguy.tistory.com/entry/PHP-inarray-사용시-integer-0-주의-1
'PHP' 카테고리의 다른 글
[PHP] PHP에서 STDERR 로 출력하는 법. (0) | 2013.03.15 |
---|---|
[PHP] 한글 도메인 퓨니코드 변환 (Punycode) (0) | 2013.01.10 |
[PHP] integer 최고값 (PHP_INT_MAX) (0) | 2012.11.22 |
[PHP] OS에 상관없이 load average 가져오기 [OS, Windows, LoadAverage] (0) | 2012.10.16 |
[PHP] 날짜 일수 차이 계산 [date_diff(), DateTime, DateInterval] (0) | 2012.10.11 |