==는 PHP가 두 값을 공통 타입으로 변환한 뒤 같은지 확인합니다. ===는 값이 같고 타입도 같은지 확인합니다. 그래서 1 == "1"은 true이고, 1 === "1"은 false입니다.
비교와 관련된 버그 대부분은 ==가 예상하지 못한 것을 변환해서 생깁니다. 기본으로는 ===와 !==를 쓰고, 변환을 원한다는 것이 확실할 때만 ==로 바꾸는 것이 좋습니다.
PHP의 모든 비교 연산자
| 연산자 | 이름 | 참이 되는 경우 |
|---|---|---|
$a == $b | 같음 | 타입 저글링 후 같음 |
$a === $b | 동일 | 같고 타입도 같음 |
$a != $b, $a <> $b | 같지 않음 | 타입 저글링 후 같지 않음 |
$a !== $b | 동일하지 않음 | 같지 않거나 타입이 다름 |
$a < $b, $a > $b | 작음, 큼 | |
$a <= $b, $a >= $b | 작거나 같음, 크거나 같음 | |
$a <=> $b | 우주선 | -1, 0, 1 중 하나를 반환 |
느슨한 비교와 엄격한 비교 표
이 표의 모든 칸은 PHP 8.3이 계산했습니다. ==와 === 사이를 전환하고 칸을 누르면 표현식이 보입니다. == 표는 null, "", "0", [] 행에서 의외의 결과로 가득하고, === 표는 대각선뿐입니다.
| $a == $b | true | false | 1 | 0 | -1 | "1" | "0" | "" | null | [] | "php" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| 1 | |||||||||||||
| 0 | |||||||||||||
| -1 | |||||||||||||
| "1" | |||||||||||||
| "0" | |||||||||||||
| "" | |||||||||||||
| null | |||||||||||||
| [] | |||||||||||||
| "php" | |||||||||||||
| "10" | |||||||||||||
| "1e1" |
==가 서로 다른 타입을 비교하는 방법
PHP 8이 따르는 규칙을 실무에서 중요한 순서로 정리했습니다.
- 숫자 형태의 문자열 둘은 숫자로 비교됩니다:
"10" == "1e1"과"1" == "01"은 둘 다true입니다. - 숫자와 숫자 형태의 문자열: 문자열이 숫자가 됩니다.
100 == "1e2"는true입니다. - 숫자와 숫자가 아닌 문자열: PHP 8부터는 숫자가 문자열이 되어 문자열로 비교됩니다.
0 == "a"는false입니다(PHP 7에서는true였습니다). - 어떤 값과 bool: 양쪽이 bool로 변환됩니다.
"a" == true와[] == false는true입니다. - null과 문자열:
null이""가 되므로null == ""는true지만null == "0"은false입니다. 다른 타입과 비교할 때null은false로 비교됩니다. - 배열 둘: 키/값 쌍이 같으면 같습니다.
마지막 줄은 null과의 대소 비교가 거의 의미 없는 이유를 보여 줍니다. null은 false가 되고, -1은 true가 되며, false < true입니다.
같지 않음: !=와 !==
!=와 <>는 같은 연산자입니다. !==는 엄격한 버전입니다. 이 차이는 strpos처럼 0이나 false를 반환하는 함수에서 가장 중요합니다.
0이 false로 변환되므로 0 != false는 false입니다. int는 bool이 아니므로 0 !== false는 true입니다. array_search와 strict 플래그 없는 in_array에도 같은 함정이 있습니다.
문자열 비교
<와 >는 문자열을 바이트 단위로 비교합니다(일반 ASCII라면 알파벳순). 두 문자열이 모두 숫자 형태면 숫자로 비교됩니다. 대소문자를 무시하거나 "자연스러운" 순서가 필요하면 함수를 쓰세요.
우주선 연산자 <=>
$a <=> $b는 $a가 작으면 -1, 같으면 0, 크면 1을 반환합니다. <와 ==와 같은 규칙을 쓰며, 정렬 콜백을 쓰는 가장 짧은 방법입니다.
두 배열을 <=>로 비교하면 요소별로 비교하며, 콜백이 나이로 먼저, 이름으로 다음에 정렬하는 방식이 이것입니다. 정렬 방법은 배열 정렬 페이지에 더 있습니다.
흔한 실수: float를 ==로 비교
float는 2진수로 저장되므로 많은 소수 값이 근사값입니다. 0.1 + 0.2는 정확히 0.3이 아니며, ==는 그 차이를 알아챕니다.
금액은 센트 단위 정수로 저장하고 ===로 비교하세요.
자주 묻는 질문
PHP에서 ==와 ===의 차이는 무엇인가요?
==는 양쪽을 공통 타입으로 변환한 뒤 비교하므로 1 == "1"은 true입니다. ===는 값이 같고 타입도 같을 때만 참이므로 1 === "1"은 false입니다. 변환을 원하지 않는다면 ===를 쓰세요.
PHP에서 0 == "a"는 true인가요?
PHP 8부터는 아닙니다. 숫자를 숫자가 아닌 문자열과 비교하면 PHP 8은 둘을 문자열로 비교하므로 0 == "a"는 false입니다. PHP 7에서는 문자열이 0으로 캐스트되어 결과가 true였습니다.
PHP에서 !=와 !==의 차이는 무엇인가요?
!=(별칭 <>)는 ==의 반대로, 타입 변환 후 값이 같으면 거짓입니다. !==는 ===의 반대로, 값이 다르거나 타입이 다르면 참입니다. 그래서 0 !== false는 true이고 0 != false는 false입니다.
PHP에서 두 float를 어떻게 비교하나요?
float 연산 결과에 ==를 쓰지 마세요: 0.1 + 0.2 == 0.3은 false입니다. 대신 차이를 작은 허용 오차와 비교하세요: abs($a - $b) < PHP_FLOAT_EPSILON. 또는 둘 다 필요한 정밀도로 반올림하세요.