В PHP я хотел бы сделать это:
switch (function_foo($bar,$bar2)) {
case $fu:
*Do Stuff*
break;
case $fubar:
*Do Other Stuff*
break;
}
Действительно ли это - ужасная идея? Это будет работать?
Использование функции в switch
нормально: функция будет вызвана и вернет значение - которое и будет использовано для case.
Это точно так же, как написать :
$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
Его возможно да и его называемая лямбда, которые являются скрытыми функциями
$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;
}
Никогда не пробовал использовать функцию в качестве параметра для переключателя
, не уверен (вам следует попробовать), однако вы можете сначала сохранить функция возвращает значение в некоторой переменной и используйте его в переключателе
, например:
$return_value = function_foo($bar, $bar2);
switch ($return_value) {
case $fu:
*Do Stuff*
break;
case $fubar:
*Do Other Stuff*
break;
}
Согласно руководству, оператор PHP switch
в точности похож на серию if
/else if
операторов (если каждый случай заканчивается break
). Это означает, что ваша методика должна работать. Пока имена функций и переменных читабельны, я не могу придумать никаких проблем.
В некоторых других языках оператор switch
фактически улучшает производительность по сравнению с операторами if
/else if
, поэтому вам нужно знать значения case во время компиляции. Не похоже, что PHP делает такие вещи.