2014-12-29 2 views
1

switch 문을 사용하는 다음 PHP 프로그램에서 왜 '= 1 대신 $ vSS = 2를 제공합니까? 나에게 이상한. PHP 5.5.9를 사용하고 있습니다. 대문자 ''를 추가하여 문제를 해결할 수 있지만, PHP가 $ vSS = 1 대신 $ vSS = 2를주는 이유가 궁금합니다. 정상입니까, 아니면 버그입니까?null 문자열을위한 PHP 스위치

<?php 
    R(15); // 1 ok 
    R(''); // why give me 2 
    R(40); // 2 ok 
    R(70); // 3 ok 
# 
    function R($SS){ 
    switch($SS){ 
     case $SS<=20: $vSS=1;break; 
     case ($SS>20 and $SS<=49.9): $vSS=2; // why here? 
     if($SS == '') echo "DEBUG: SS is a null string.<br>\n"; 
     break; 
     case ($SS<=100 and $SS>49.9): $vSS=3; break; 
     default:$vSS=0 ; 
    } 
    echo "DEBUG:(SS/vSS) $SS:$vSS\n"; 
    } 
?> 

------ RESULT 
DEBUG:(SS/vSS) 15:1 
DEBUG: SS is a null string.<br> 
DEBUG:(SS/vSS) :2 
DEBUG:(SS/vSS) 40:2 
DEBUG:(SS/vSS) 70:3 
+0

'함수 R()'에 switch() 문을 변경? 'echo "DEBUG : (SS/vSS) $ SS : $ vSS \ n";'오, 나는 그것을 좋아한다. @Barmar가 옳다.'switch-case'는 다음과 같이 작동하지 않는다. – vladkras

답변

0

@Barmar이 case()의 표현 switch(something_here)에 비교되는 권리입니다하지만 당신은 cahnge 필요가 없습니다 당신의 모든 코드는 if/elsif/elsif/.../... 논리에. 그냥 true

switch(true) { // <-- this part only 
    case $SS<=20: 
     $vSS=1; 
     break; 
    case ($SS>20 and $SS<=49.9): 
    $vSS=2; // why here? 
    // must not be here 
    // if($SS == '') echo "DEBUG: SS is a null string.<br>\n"; 
    break; 
    case ($SS<=100 and $SS>49.9): 
     $vSS=3; 
     break; 
    case $SS=='': // you can check it here 
     echo "DEBUG: SS is a null string.<br>\n"; 
     break; 
    default: 
     $vSS=0 ; 
} 
2

switch의 작동 방식을 이해하지 못했습니다. 의 값과 case 값을 각각 비교하면 각 case을 테스트하는 것이 아닙니다. 그래서

switch ($SS) { 
case $SS<=20: 

은 비슷하다

if ($SS == ($SS<=20)) 

번째 경우 실행되는 이유 ($SS > 20 && $SS <= 49.9) false이므로이며 false 제로 빈 문자열과 동일한 것으로 간주된다.

당신이 무슨 일을하는지에 대한 switch을 사용해서는 안

, 당신은 if/then/elseif/else 사용해야합니다

if ($SS <= 20) { 
    $vSS = 1; 
} elseif ($SS <= 49.9) { 
    $vSS = 2; 
} else { 
    $vSS = 0; 
}