반응형
Web Development · PHP nested if
PHP 중첩 if-else —
"3가지 이상" 분기를 만드는 방법
type 값에 따라 다른 화면을 보여주는 다중 분기 패턴
시작 오늘 분석할 코드
$type 값에 따라 등록 폼·등록 처리·오류 화면 중 하나를 보여주는 코드. else 안에 다시 if를 넣은 중첩 구조로 3가지 이상 분기를 만들었다.
<?php $type = "form"; if($type == "form"){ print "등록 폼입니다."; }else{ if($type == "exec"){ print "등록 처리를 실행중"; }else{ print "화면이 없습니다."; } } ?>
실제 출력 미리보기
등록 폼입니다.
→ $type이 "form"이므로 첫 번째 if가 참 → 본문 실행 → 나머지는 모두 건너뜀.
용어 용어 정리
중첩if 안에 또 if를 넣은 구조
분기조건에 따라 갈라지는 처리 경로
elseif중첩 if-else를 평탄하게 쓰는 키워드
$type현재 화면 모드를 담은 변수 (form/exec/...)
==값 같은가 비교
기본 분기어느 조건에도 안 맞을 때 실행되는 마지막 else
indentation중첩이 깊어질수록 들여쓰기 단계 ↑
switch동일 변수 다중 분기에 더 깔끔한 대안
1 중첩 if-else의 의미
처음 if가 거짓일 때만 else 안의 코드가 실행되고, 그 안에서 다시 새 조건을 검사한다. 이렇게 "안 맞으면 다음 가능성을 다시 검사"를 쌓아가는 구조다.
$type == "form" ? ├ 참 → "등록 폼입니다." └ 거짓 → ($type == "exec" ?) ├ 참 → "등록 처리를 실행중" └ 거짓 → "화면이 없습니다."
3가지 이상의 가능성이 있을 때 자연스럽게 만들어지는 모양 — 다만 가능성이 많아질수록 들여쓰기가 깊어져 가독성이 떨어진다.
2 본 코드의 동작
| $type 값 | 실행되는 분기 | 출력 |
|---|---|---|
"form" |
첫 if 참 | 등록 폼입니다. |
"exec" |
첫 if 거짓 → else 안의 if 참 | 등록 처리를 실행중 |
| 그 외 (예: "abc") | 모두 거짓 → 마지막 else | 화면이 없습니다. |
반응형
3 같은 의도를 더 깔끔하게 —
elseif본 코드처럼 "한 변수의 값에 따른 분기"는 elseif로 평탄하게 쓰는 게 가독성이 훨씬 낫다. 들여쓰기가 깊어지지 않는다.
중첩 if-else (본 코드)
if($type == "form"){
...
}else{
if($type == "exec"){
...
}else{
...
}
}elseif (개선)
if($type == "form"){
...
}elseif($type == "exec"){
...
}else{
...
}두 코드는 완전히 같은 결과를 만든다. 컴퓨터 입장에선 동일하지만, 사람이 읽기엔 후자가 훨씬 명확하다.
4 더 좋은 대안 —
switch"하나의 변수를 여러 값과 비교"하는 패턴이라면 switch가 더 명확하다. 같은 변수를 반복해서 적지 않아도 된다.
switch($type){ case "form": print "등록 폼입니다."; break; case "exec": print "등록 처리를 실행중"; break; default: print "화면이 없습니다."; }
※ if-elseif vs switch — 언제 무엇을?
- 같은 변수를 여러 값과 비교 → switch가 깔끔
- 다양한 조건/연산이 섞임 ($a > 10, $b == "x" 등) → if-elseif
- 분기 2~3개 이하 → if-else로 충분
- 분기 4개 이상이고 동일 변수 → switch나 match (PHP 8+)
5 중첩이 깊어지면 생기는 문제
if(...){ if(...){ if(...){ if(...){ // 들여쓰기 4단계 — 가독성 ↓ } } } }
이런 코드는 "arrow code" 또는 "죽음의 피라미드"라고 불린다. 디버깅이 어렵고, 깊은 곳에 버그가 숨기 쉽다. 해결법은 조기 반환(early return)이다.
// 깊은 중첩 (나쁨) function process($user){ if($user){ if($user->active){ if($user->hasPermission){ return doWork(); } } } return null; } // 조기 반환 (좋음) function process($user){ if(!$user) return null; if(!$user->active) return null; if(!$user->hasPermission) return null; return doWork(); }
6 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| 중괄호 누락 → dangling else | else가 엉뚱한 if에 붙음 | 모든 if/else에 중괄호 명시 |
분기마다 변수명 반복 ($type × N번) |
가독성 ↓, 오타 위험 ↑ | switch나 match로 치환 검토 |
| 마지막 else 누락 | 예상 못한 입력값에 대해 출력 0 | "기본 처리"용 else 명시 |
| 들여쓰기 혼란 (탭/스페이스 섞임) | 중첩 깊이 헷갈림 | 일관된 들여쓰기 사용 |
비교에 = 1개 |
대입이 일어나 항상 참 | == 또는 === |
7 PHP 8+ 의
match 표현식PHP 8 부터는 match가 추가됐다. switch보다 짧고, break 없음, 엄격 비교(===), 값을 반환하는 장점이 있다.
// PHP 8+ $message = match($type){ "form" => "등록 폼입니다.", "exec" => "등록 처리를 실행중", default => "화면이 없습니다.", }; print $message;
※
match는 ===로 비교하므로 0과 "0"을 다르게 본다. 그리고 매치되는 케이스가 없고 default도 없으면 예외 발생.핵심 한 줄 요약
중첩 if-elseelse 안에 또 if를 넣어 다중 분기 구현
elseif같은 효과를 평탄하게 — 가독성 좋음
switch한 변수 다중 비교에 가장 적합
match (PHP 8+)값 반환 + 엄격 비교 + break 불필요
기본 else예상 외 값 처리 — 항상 마련 권장
중첩 깊이3단계 넘으면 조기 반환·함수 분리 검토
중괄호dangling else 방지 — 항상 사용
반응형
'php' 카테고리의 다른 글
| PHP로 SELECT 옵션 동적 생성 — 배열 → HTML 만들기 완전 정리 (0) | 2026.06.12 |
|---|---|
| PHP for + count() — 배열 길이만큼 반복하는 패턴 완전 정리 (0) | 2026.06.12 |
| PHP if-else — 로그인 성공/실패 분기 처리 완전 정리 (0) | 2026.06.12 |
| PHP if 조건문 — 로그인 검증 예제로 배우는 && 연산자 (0) | 2026.06.12 |
| PHP foreach 반복문 — 배열 순회 전용 완전 정리 (0) | 2026.06.12 |
왕진 블로그

댓글