PHP 매뉴얼
이전 | 11. 장. 제어 구조 | 다음

# `switch`

`switch`구문은 연속적인 같은 표현식을 갖는 연속적인 IF구문과 비슷하다. 많은 경우, 하나의 변수(또는 표현식)으로 다른 많은 값과 비교할 필요가 있으며, 그 값이 동일한 코드의 파편들을 수행할 필요가 생기게 된다. 정확히 이런 목적을 위해 `switch`구문이 사용된다.

> 참고: 다른 언어와는 달리 continue문은 switch문에서 사용할수 있고, `break`문과 비슷하게 동작한다. 루프 내에 switch문을 포함하고 있고 바깥 루프의 다음 반복문으로 진행하고 싶다면 `continue 2`를 사용한다.

다음 예제 코드들은 같은 일을 서로 다르게 표현한 것입니다. 하나는 `if`와 `elseif`문을 사용한 것이고, 다른 하나는 `switch`문을 사용했습니다:

`<?php if ($i == 0) { echo "i는 0"; } elseif ($i == 1) { echo "i는 1"; } elseif ($i == 2) { echo "i는 2"; } switch ($i) { case 0: echo "i는 0"; break; case 1: echo "i는 1"; break; case 2: echo "i는 2"; break; } ?>`

실수하지 않기 위해 `switch`문이 어떻게 동작하는지 이해할 필요가 있다. `switch`문은 한줄씩 수행된다 (실제는, 한구문씩). 처음에는 아무 코드도 수행되지 않는다. 오직 값을 갖는 `case`문이 발견될때에만 구문을 수행하기 시작한다. PHP는 `switch`블록의 끝부분이 될때까지, 또는 `break`문와 첫번째 조우를 할때까지 구문을 계속 수행해 간다. 만약 각 case 구문 목록의 끝부분에 `break`문을 쓰지않는다면 PHP는 다음 case문으로 계속 진행하게 된다. 예를 들면 다음과 같다:

`<?php switch ($i) { case 0: echo "i는 0과 같다"; case 1: echo "i는 1과 같다"; case 2: echo "i는 2와 같다"; } ?>`

여기에서, $i가 0이라면 PHP는 모든 echo문을 수행합니다! $i가 1이면 밑의 두 echo문을 수행합니다. $i가 2일때만 원하는 동작 ('i는 2와 같다'를 표시)을 합니다. 따라서 `break`문을 잊어서는 안됩니다. (어떤 경우에는 일부러 빠뜨릴수 있을지 모르지만)

`switch`구문에서, 조건문은 오직 한번만 평가되고 각 `case`문에서 결과가 비교되어진다. `elseif`문에서는 조건문은 다시 평가된다. 조건문이 한번 이상의 비교가 필요한 복잡한 것이거나 거친(tight) 루프안에 있다면 `switch`문 좀 더 빠를것이다.

case에 대한 구문 목록은 비어있을수 있다. 이것은 단순히 다음 case문으로 제어권을 넘겨줄 뿐이다.

`<?php switch ($i) { case 0: case 1: case 2: echo "i는 3보다 작지만 음수는 아닙니다."; break; case 3: echo "i는 3"; } ?>`

특별한 case가 바로 `default` case문이다. 이것은 다른 case문과 모두 조건이 맞지 않을때의 경우를 위한것이고, `case`구문의 마지막에 위치해야 한다. 예제 코드는 다음과 같다:

`<?php switch ($i) { case 0: echo "i는 0과 같다"; break; case 1: echo "i는 1과 같다"; break; case 2: echo "i는 2와 같다"; break; default: echo "i는 0, 1, 2 어느것도 아니다"; } ?>`

`case`의 표현식은 정수나 부동소수점 수와 문자열같은 단순형으로 평가되는 어던 표현식도 될수 있다. 여기에 단순형으로 재참조(dereference)되지 않는 배열이나 객체를 사용할수는 없다.

switch문을 위한 제어 구조의 대체 문법이 지원된다. 더 자세한 정보는 제어 구조의 대체 문법을 참고.

`<?php switch ($i): case 0: echo "i equals 0"; break; case 1: echo "i equals 1"; break; case 2: echo "i equals 2"; break; default: echo "i is not equal to 0, 1 or 2"; endswitch; ?>`

이전 | 처음으로 | 다음
`continue` | 위로 | `declare`