Menu

PHP 연산자: 산술, 논리, 문자열 연산자 정리

PHP 연산자는 값을 다룹니다. 산술 +, -, *, /, %, **, 대입 =, +=, .=, ??=, 논리 &&, ||, !, xor, 문자열 연결 ., 비교 ==, ===, <=>, 증감 ++, --. 그룹별로 실행 가능한 예제와 and와 && 우선순위 함정을 배웁니다.

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

연산자는 하나 이상의 값을 받아 새 값을 만듭니다. $a + $b는 더하고, $a . $b는 문자열을 연결하고, $a && $b는 논리 AND이고, $a === $b는 비교하고, $i++는 증가시킵니다.

/는 두 정수가 나누어떨어질 때를 빼고 float를 반환합니다. 17 / 5는 3.4이고, 10 / 5는 정수 2입니다. 정수 부분만 원한다면 intdiv()를 쓰세요. 반올림은 수학 페이지에서 다룹니다.

산술 연산자

연산자이름예결과
+덧셈7 + 29
-뺄셈7 - 25
*곱셈7 * 214
/나눗셈7 / 23.5
%나머지7 % 21
**거듭제곱7 ** 249
-$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 반복문의 증감처럼 한 줄에 단독으로 쓰면 차이가 없습니다.

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

Coddy로 코딩 배우기

시작하기