연산자는 하나 이상의 값을 받아 새 값을 만듭니다. $a + $b는 더하고, $a . $b는 문자열을 연결하고, $a && $b는 논리 AND이고, $a === $b는 비교하고, $i++는 증가시킵니다.
/는 두 정수가 나누어떨어질 때를 빼고 float를 반환합니다. 17 / 5는 3.4이고, 10 / 5는 정수 2입니다. 정수 부분만 원한다면 intdiv()를 쓰세요. 반올림은 수학 페이지에서 다룹니다.
산술 연산자
| 연산자 | 이름 | 예 | 결과 |
|---|---|---|---|
+ | 덧셈 | 7 + 2 | 9 |
- | 뺄셈 | 7 - 2 | 5 |
* | 곱셈 | 7 * 2 | 14 |
/ | 나눗셈 | 7 / 2 | 3.5 |
% | 나머지 | 7 % 2 | 1 |
** | 거듭제곱 | 7 ** 2 | 49 |
-$a | 부호 반전 | -7 | -7 |
나머지 연산은 "N번째 항목마다"나 짝수/홀수 판별에 유용합니다. 결과는 왼쪽의 부호를 따르며, 0으로 나누면 잡을 수 있는 에러가 던져집니다.
대입 연산자
=는 값을 저장합니다. 모든 산술 연산자와 문자열 연산자에는 변수를 그 자리에서 갱신하는 복합 형태가 있습니다.
??=는 null 병합 연산자 계열입니다. 변수가 설정되지 않았거나 null일 때만 대입합니다.
증가와 감소: ++와 --
$i++는 현재 값을 반환한 뒤 1을 더합니다. ++$i는 1을 더한 뒤 새 값을 반환합니다. 차이는 같은 표현식에서 결과를 사용할 때만 드러납니다.
문자 증가 기법은 스프레드시트의 열 이름(A, B, ... Z, AA)을 만들 때 자주 쓰입니다.
논리 연산자: &&, ||, !, xor
| 연산자 | 참이 되는 경우 |
|---|---|
$a && $b | 둘 다 참 |
$a || $b | 하나 이상이 참 |
!$a | $a가 거짓 |
$a xor $b | 정확히 하나만 참 |
$a and $b, $a or $b | &&, ||와 같지만 우선순위가 낮음 |
&&와 ||는 단락 평가를 합니다. 왼쪽이 이미 결과를 결정하면 오른쪽은 평가되지 않습니다. 그래서 isset($user) && $user->isAdmin()이 안전합니다.
and와 &&: 우선순위 함정
and와 or는 =보다 느슨하게 결합하므로, 대입에서는 값이 저장된 뒤에 적용됩니다. 대표적인 버그입니다.
낮은 우선순위가 유용한 관용구가 하나 있습니다: $file = fopen($path, 'r') or die('Cannot open');. 여기서는 대입이 먼저 일어나길 원합니다. 그 밖의 모든 곳에서는 &&와 ||를 쓰세요.
문자열 연산자: .와 .=
PHP에는 문자열 연산자가 두 개 있습니다. .는 두 문자열을 연결하고("Grace" . " " . "Hopper"), .=는 변수 뒤에 덧붙입니다($html .= "<li>"). +는 절대 문자열을 연결하지 않습니다. "3" + "4"는 숫자 7이고, "3" . "4"는 문자열 "34"입니다. 보간과 따옴표는 문자열 페이지에서 다룹니다.
비교와 우주선 연산자 <=>
==는 타입을 변환한 뒤 비교하고, ===는 타입까지 확인하며, <=>는 -1, 0, 1을 반환하는데 이는 정렬 콜백에 딱 필요한 값입니다. 자세한 내용과 느슨한 비교 전체 표는 비교 연산자 페이지에 있습니다.
배열 연산자
배열에서 +는 합집합입니다. 왼쪽 배열의 키가 우선하고, 오른쪽에서는 없는 키만 추가됩니다. 뒤에 붙을 거라 기대한 사람은 놀랍니다. ==는 같은 키/값 쌍인지 확인하고, ===는 순서와 타입까지 같아야 합니다.
한 리스트를 다른 리스트 뒤에 붙이려면 array_merge()나 스프레드 문법 [...$a, ...$b]를 쓰세요.
연산자 우선순위
표현식에 연산자가 섞이면 PHP는 정해진 순서로 적용합니다. 사람들이 자주 걸려 넘어지는 것들과 PHP 8.3의 출력입니다.
echo 2 + 3 * 4; // 14: * before +
echo (2 + 3) * 4; // 20
echo 2 ** 3 ** 2; // 512: right to left, 2 ** 9
echo -2 ** 2; // -4: ** before unary minus
echo "Sum: " . 2 + 3; // Sum: 5, since PHP 8 + runs before .
확실하지 않으면 괄호를 추가하세요. 비용이 들지 않고, 다음에 그 줄을 읽는 사람이 표를 외울 필요가 없습니다.
자주 묻는 질문
PHP에서 and와 &&의 차이는 무엇인가요?
둘 다 논리 AND이지만 and는 =보다 우선순위가 낮습니다. 그래서 $x = true and false;는 $x에 true를 저장하고(대입이 먼저 일어남), $x = true && false;는 false를 저장합니다. 표현식에는 &&와 ||를 쓰고, 대입에서는 and/or를 피하세요.
PHP에서 %는 무엇을 하나요?
%는 나머지 연산자로, 정수 나눗셈의 나머지를 반환하므로 10 % 3은 1입니다. 결과는 왼쪽 피연산자의 부호를 따릅니다(-7 % 3은 -1). float에는 fmod()를 쓰고, % 0은 DivisionByZeroError를 던집니다.
PHP에서 거듭제곱은 어떻게 하나요?
** 연산자를 쓰세요: 2 ** 10은 1024입니다. 오른쪽 결합이므로 2 ** 3 ** 2는 2 ** 9 = 512이고, 단항 마이너스보다 먼저 결합하므로 -2 ** 2는 -4입니다. pow(2, 10) 함수도 같은 일을 합니다.
PHP에서 $i++와 ++$i의 차이는 무엇인가요?
둘 다 $i에 1을 더합니다. $i++(후위 증가)는 이전 값을 반환한 뒤 증가시키고, ++$i(전위 증가)는 먼저 증가시킨 뒤 새 값을 반환합니다. for 반복문의 증감처럼 한 줄에 단독으로 쓰면 차이가 없습니다.