使用案例变量和开关功能?

时间:2010-03-04 21:18:34

标签: php case switch-statement

在PHP中,我想这样做:

switch (function_foo($bar,$bar2)) {
case $fu:
    *Do Stuff*
    break;
case $fubar:
    *Do Other Stuff*
    break;
}

这是一个糟糕的主意吗?它会起作用吗?

4 个答案:

答案 0 :(得分:8)

使用switch中的函数是可以的:函数将被调用,并将返回一个值 - 这将是用于案例的值。

与写作完全一样:

$my_var = function_foo($bar,$bar2);
switch ($my_var) {
    // ...
}

即使我更喜欢使用变量,代码也更容易阅读。


case中使用变量是您经常看不到的;但它也可以正常工作; - )

引用the manual page of switch

  

案例表达可以是任何   表达式,评估为简单   type,即整数或   浮点数和字符串。

因此,只要$fu$fubar包含简单类型的值,您的代码就会有效。


使用变量作为case值并不经常(据我所知,从我读过的代码中可以看出),可能是因为其他一些语言不允许(for例如,C不允许这样做;而switch / case结构是从C)借来的;但它的确有效:

$a = 1;
$b = 2;
switch (1) {
    case $a: echo 'a'; break;
    case $b: echo 'b'; break;
}

将输出:

a

答案 1 :(得分:2)

从未尝试过函数作为switch的参数,不确定(你应该试一试),但是你可以先将函数返回值存储在某个变量中并在switch中使用它,例如:

$return_value = function_foo($bar, $bar2);

switch ($return_value) {
case $fu:
    *Do Stuff*
    break;
case $fubar:
    *Do Other Stuff*
    break;
}

答案 2 :(得分:1)

根据the manual,PHP switch语句与一系列if / else if语句完全相同(如果每个案例都以break结尾)。这意味着你的技术应该有效。只要函数名和变量名是可读的,我就不会想到它有任何问题。

在其他一些语言中,switch语句实际上是对if / else if语句的性能提升,因此您需要在编译时知道案例值。它看起来不像PHP那样做。

答案 3 :(得分:1)

可能是的,它被称为lambda,它们是隐藏的函数

$lambda = function($a, $b) {
    return $a * $b;
};


$return_value = function foo($bar, $bar2){ return $logic }

switch ($lambda(2,4)) {
case $fu:
    *Do Stuff*
    break;
case $fubar:
    *Do Other Stuff*
    break;
}