1

那是代码:

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,因为有很多比较并愿意尝试。在这种情况下,3rdcase总是给我正确的输出,即使$_REQUEST['c']大于$cbase,而应该落到default:|

4

1 回答 1

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;
}
于 2013-08-20T23:52:52.927 回答