Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP switch 문에서 case 0이 실행되는 이유와 원리 완벽 정리

PHP switch 문에서 case 0이 실행되는 이유

PHP는 느슨한 타입(loosely typed) 언어입니다. switch 문은 내부적으로 느슨한 비교(==)를 사용하기 때문에, 조건값이 문자열이고 case 값이 정수일 경우 문자열이 정수로 변환된 후 비교됩니다. 이 과정에서 숫자로 해석할 수 없는 문자열은 0으로 변환되므로, 의도하지 않게 case 0 블록이 먼저 실행될 수 있습니다.

예를 들어 다음과 같은 switch 표현식이 있다고 가정해 보겠습니다.

switch ("match")

이제 case 0과 비교하는 부분은 다음과 같습니다.

case 0:
    echo " 0 with match";
    break;

동시에 문자열을 비교하는 case도 함께 작성했다고 가정합니다.

case "match":
    echo "match successful";
    break;

전체 예제 코드

<!DOCTYPE html>
<html>
<body>
<?php
switch ("match") {
    case 0:
        echo " 0 with match";
        break;
    case "match":
        echo "match successful";
        break;
}
?>
</body>
</html>

실행 결과

0 with match

분명히 문자열 "match"에 해당하는 case가 존재하는데도 결과는 "0 with match"가 출력됩니다.

왜 이런 현상이 발생할까?

PHP에서 문자열과 정수를 느슨하게 비교하면 문자열이 숫자로 변환됩니다. 이때 "match"처럼 숫자로 시작하지 않는 문자열은 0으로 변환되기 때문에 "match" == 0은 true가 됩니다. switch 문은 위에서 아래로 순차적으로 각 case를 검사하므로, case 0이 먼저 일치하여 해당 블록이 실행되고 break 문으로 switch를 빠져나가게 됩니다. 결국 뒤에 있는 case "match"는 실행 기회조차 얻지 못합니다.

주의 사항과 해결 방법

이러한 예상치 못한 동작을 방지하려면 다음 사항을 고려하는 것이 좋습니다.

  • case 순서 조정: 문자열 case를 정수 case보다 앞에 배치하거나, 하나의 switch 문에서 문자열 case와 정수 case를 섞어 사용하지 않도록 합니다.
  • 타입 사전 확인: switch 문 실행 전에 gettype() 함수 등으로 변수의 타입을 미리 점검합니다.
  • PHP 8 이상 환경: PHP 8.0부터 문자열과 숫자의 비교 규칙이 변경되었습니다. 숫자 형태가 아닌 문자열을 숫자와 비교하면 문자열이 0으로 변환되지 않고, 대신 숫자가 문자열로 변환되어 비교됩니다. 따라서 PHP 8 이상에서는 위 예제가 "match successful"을 출력합니다.
  • match 표현식 활용: PHP 8.0에서 도입된 match 표현식은 엄격한 비교(===)를 사용하므로 이러한 암묵적 타입 변환 문제가 발생하지 않습니다.