if (condition) { ... }은 조건이 참일 때만 블록을 실행합니다. 경우를 더 나누려면 elseif (other condition) { ... }을, 나머지 모든 경우에는 else { ... }를 추가합니다. PHP는 위에서부터 조건을 확인하고 처음 일치하는 블록 하나만 실행합니다.
$temperature를 바꾸고 다시 실행해 보세요. 확인이 위에서 아래로 진행되므로 24는 두 번째 조건에서 멈추고, >= 10도 참이지만 거기까지 가지 않습니다. 조건은 가장 구체적인 것부터 가장 일반적인 것 순으로 놓으세요.
elseif와 else if
중괄호를 쓰면 elseif와 else if는 같은 일을 합니다. else if는 엄밀히 말해 본문이 새 if인 else지만 결과는 같습니다.
차이는 템플릿에서 쓰는 콜론 문법(다음 절들)에서만 드러납니다. 거기서는 else if가 코드를 망가뜨립니다.
<?php $score = 72; ?>
<?php if ($score >= 90): ?>
<p>A</p>
<?php else if ($score >= 60): ?>
<p>Passed</p>
<?php endif; ?>
PHP Parse error: syntax error, unexpected token "if", expecting ":" in /home/index.php on line 4
elseif를 한 단어로 쓰면 이 에러를 만날 일이 없습니다.
&&와 ||로 여러 조건
&&(그리고)는 양쪽이 모두 참이어야 하고, ||(또는)는 하나 이상이 참이면 되며, !는 조건을 뒤집습니다. PHP는 답이 정해지는 즉시 평가를 멈추므로, $user !== null && $user['active']에서 두 번째 부분은 사용자가 있을 때만 실행됩니다.
&&와 ||를 섞을 때는 괄호를 추가하세요. &&가 더 강하게 결합하며, 괄호가 있으면 다음에 읽는 사람에게 의도가 분명해집니다. PHP에는 and와 or 키워드도 있지만 =보다 우선순위가 낮아서 $ok = true and false;는 $ok를 true로 설정합니다. &&와 ||만 쓰세요.
if에서 참으로 취급되는 것
조건이 꼭 불리언일 필요는 없습니다. PHP가 변환하며, 몇 가지 값이 거짓으로 취급됩니다: false, 0, 0.0, "", "0", [], null. 나머지는 모두 참이며 "false", " ", "0.0"도 포함됩니다.
| $x | bool | empty |
|---|---|---|
| false | ||
| 0 | ||
| 0.0 | ||
| "" | ||
| "0" | ||
| null | ||
| [] | ||
| " " | ||
| "0.0" | ||
| "a" | ||
| [0] | ||
| 1 |
그래서 if ($items)가 "배열이 비어 있지 않다"를 말하는 흔한 방법입니다. 문제가 되는 것은 "0" 행입니다. 누군가 0을 입력한 폼 필드는 비어 있지 않은 문자열인데도 if ($_POST['qty'])는 그것을 거짓으로 취급합니다. 0이 유효한 답이라면 명시적으로 비교하세요(if ($qty !== '')). empty()가 반환하는 값도 같은 규칙으로 정해집니다.
HTML 속 if else: if:와 endif;
HTML 태그 사이에서는 중괄호를 놓치기 쉽습니다. PHP에는 대체 문법이 있습니다. 조건 뒤에 콜론, 다른 분기에는 elseif ...:와 else:, 끝에는 endif;입니다. 이 블록을 실행한 뒤 Page 탭의 점수를 클릭하세요. 각 링크가 새 $_GET['score']로 같은 스크립트를 다시 실행합니다.
<?= $score ?>는 <?php echo $score; ?>의 줄임입니다. 같은 콜론 스타일이 반복문에도 있으며(foreach: endforeach;, while: endwhile;), 대부분의 PHP 템플릿이 이 방식을 씁니다.
한 줄 if와 삼항 연산자
문장이 하나라면 중괄호 없이 조건 뒤에 올 수 있습니다. 동작은 하지만, 다음에 추가하는 줄은 if 안에 들어가지 않으므로 많은 스타일 가이드가 항상 중괄호를 요구합니다. 두 값 중 하나를 고를 때는 삼항 연산자가 전체 if/else보다 짧습니다.
한 변수를 여러 정확한 값과 비교해야 한다면 긴 elseif 체인보다 match 표현식이 읽기 좋습니다.
중첩하지 말고 일찍 반환하기
깊게 중첩된 if 블록은 따라가기 어렵습니다. 함수 안에서는 실패하는 경우를 먼저 확인하고 바로 return하세요. 그러면 주요 로직이 왼쪽 가장자리에 놓입니다.
흔한 실수: 조건에 == 대신 =
= 하나는 대입입니다. if ($role = 'admin')은 $role에 'admin'을 저장한 뒤 그 문자열을 검사하므로 참입니다. 모든 사용자에 대해 블록이 실행되고, $role도 잘못된 값이 됩니다.
타입 저글링을 원할 이유가 없다면 비교에는 ===를 쓰세요. 상수를 먼저 쓰는 사람도 있습니다(if ('admin' === $role)). 그러면 =를 빠뜨렸을 때 조용한 대입이 아니라 에러가 됩니다.
자주 묻는 질문
PHP에서 elseif와 else if의 차이는 무엇인가요?
중괄호를 쓰면 똑같이 동작합니다. else if는 본문이 또 하나의 if인 else입니다. 콜론 문법(if (...): ... endif;)에서는 elseif만 동작하고 else if는 구문 에러입니다. 어디서나 elseif를 쓰면 이 차이를 신경 쓸 필요가 없습니다.
PHP if문에서 여러 조건을 확인하려면 어떻게 하나요?
&&(모두 참이어야 함)나 ||(하나 이상)로 연결하세요: if ($age >= 18 && $hasTicket) { ... }. 둘을 섞을 때는 괄호를 쓰세요. 예: if ($isAdmin || ($isOwner && $isActive)).
PHP에서 if문을 한 줄로 쓰려면 어떻게 하나요?
문장이 하나라면 중괄호 없이 조건 뒤에 쓸 수 있습니다: if ($debug) echo 'debug mode';. 한 줄에서 두 값 중 하나를 고르려면 삼항 연산자를 쓰세요: $label = $count === 1 ? 'item' : 'items';.
PHP에서 HTML 안에 if else를 쓰려면 어떻게 하나요?
HTML 태그 사이에서 읽기 좋은 대체 문법을 쓰세요: <?php if ($loggedIn): ?> <p>Welcome back</p> <?php else: ?> <a href="/login">Log in</a> <?php endif; ?>.