Menu

PHP 비교 연산자: ==와 === 차이, <=>

PHP는 ==(타입 변환 후 같음), ===(값과 타입이 같음), !=와 !==, < > <= >=, 우주선 연산자 <=>로 값을 비교합니다. ==가 언제 타입을 변환하는지, PHP 8에서 무엇이 바뀌었는지, 느슨한 비교와 엄격한 비교를 한 표에서 확인하세요.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

==는 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", [] 행에서 의외의 결과로 가득하고, === 표는 대각선뿐입니다.

느슨한 비교(==)와 엄격한 비교(===)
Point at or tap a cell to read it as PHP.
$a == $btruefalse10-1"1""0"""null[]"php""10""1e1"
true
false
1
0
-1
"1"
"0"
""
null
[]
"php"
"10"
"1e1"
Every cell computed by PHP 8.3.19.

==가 서로 다른 타입을 비교하는 방법

PHP 8이 따르는 규칙을 실무에서 중요한 순서로 정리했습니다.

  1. 숫자 형태의 문자열 둘은 숫자로 비교됩니다: "10" == "1e1"과 "1" == "01"은 둘 다 true입니다.
  2. 숫자와 숫자 형태의 문자열: 문자열이 숫자가 됩니다. 100 == "1e2"는 true입니다.
  3. 숫자와 숫자가 아닌 문자열: PHP 8부터는 숫자가 문자열이 되어 문자열로 비교됩니다. 0 == "a"는 false입니다(PHP 7에서는 true였습니다).
  4. 어떤 값과 bool: 양쪽이 bool로 변환됩니다. "a" == true와 [] == false는 true입니다.
  5. null과 문자열: null이 ""가 되므로 null == ""는 true지만 null == "0"은 false입니다. 다른 타입과 비교할 때 null은 false로 비교됩니다.
  6. 배열 둘: 키/값 쌍이 같으면 같습니다.

마지막 줄은 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. 또는 둘 다 필요한 정밀도로 반올림하세요.

Coddy 프로그래밍 언어 일러스트

Coddy로 코딩 배우기

시작하기