используя переменные для случаев и функцию для переключения? - PullRequest
6 голосов
/ 05 марта 2010

В PHP я хотел бы сделать это:

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

Это ужасная идея? Будет ли это работать?

Ответы [ 4 ]

9 голосов
/ 05 марта 2010

Использование функции в switch в порядке: функция будет вызвана и вернет значение, которое будет использоваться для случая.

Это точно так же, как писать:

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

Даже если я предпочитаю использовать переменную, код легче читать.


И использование переменных в case - это то, что вы не часто видите; но тоже отлично работает; -)

Цитирование Страница справочника switch:

Выражение case может быть любым выражение, которое оценивается в простой тип, то есть целое число или числа и строки с плавающей точкой.

Итак, ваш код будет работать, пока $fu и $fubar содержат значения простого типа.


Использование переменной в качестве значения case не часто делается (насколько я могу судить из кода, который я прочитал) , вероятно, потому что некоторые другие языки не допускают этого (например, C этого не позволяет, а структура switch / case заимствована из C) ; но это работает:

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

Будет выводить:

a
2 голосов
/ 05 марта 2010

Никогда не пробовал функцию в качестве параметра для switch, не уверен (вы должны попробовать), однако вы можете сначала сохранить возвращаемое значение функции в некоторой переменной и использовать его в switch, например:

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

switch ($return_value) {
case $fu:
    *Do Stuff*
    break;
case $fubar:
    *Do Other Stuff*
    break;
}
1 голос
/ 05 марта 2010

Его да, и его называют лямбда, которые являются скрытыми функциями

$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;
}
1 голос
/ 05 марта 2010

Согласно инструкции , оператор PHP switch в точности похож на серию операторов if / else if (если каждый случай заканчивается break). Это означает, что ваша техника должна работать. Пока имена функций и имена переменных читаемы, я не могу думать о каких-либо проблемах с ним.

В некоторых других языках оператор switch фактически повышает производительность по сравнению с операторами if / else if, поэтому вам нужно знать значения регистра во время компиляции. Не похоже, что PHP делает такие вещи.

...