在交换机情况下的比较,它们有效吗?

时间:2013-08-20 23:48:54

标签: php syntax switch-statement

这是代码:

switch (true)
{
  case (isset($_REQUEST['a']) && is_numeric($_REQUEST['a']) && ($_REQUEST['a'] > 0)):
  case (isset($_REQUEST['b']) && is_string($_REQUEST['b']) && in_array($_REQUEST['b'], $barray)):
  case (isset($_REQUEST['c']) && is_numeric($_REQUEST['c']) && ($_REQUEST['c'] > 0) && ($_REQUEST['c'] <= $cbase)):
    try { echo "Foo"; }
    catch(Exception $e) { echo $e->getMessage(); }
    break;
  default:
    echo "Bar"; break;
}

我想知道这些是否允许在开关盒中使用? 很快我就必须使用switch因为许多比较并愿意尝试它。在这种情况下,即使case大于$_REQUEST['c'],第三个$cbase也会始终提供正确的输出,而default则应该落在{{1}}:|

1 个答案:

答案 0 :(得分:2)

是的,这是有效的。使用switch(TRUE)可以在switch语句中进行严格的比较。检查这个例子:

非类型安全:

$a = '1';
switch($a) {

    case 1 : 
        // do something (will get executed)
        break;

    case '1' : 
        // do something:
        break;

}

更好:

$a = '1';
switch(TRUE) {

    case $a === 1 : 
        // do something; (will not get executed)
        break;

    case $a === '1' : 
        // .. do something;
        break;

}

此用法也允许更复杂的case语句,如下所示:

switch(TRUE) {
    case strpos($input, 'a') === 0 :
        // do something
        break;
    case strpos($input, 'b') === 0 :
        // do something
        break;
}