использование переменных для случаев и функции для переключателя?

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

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

Действительно ли это - ужасная идея? Это будет работать?

6
задан aslum 4 March 2010 в 21:18
поделиться

4 ответа

Использование функции в 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
9
ответ дан 8 December 2019 в 18:35
поделиться

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

$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
ответ дан 8 December 2019 в 18:35
поделиться

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

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

switch ($return_value) {
case $fu:
    *Do Stuff*
    break;
case $fubar:
    *Do Other Stuff*
    break;
}
2
ответ дан 8 December 2019 в 18:35
поделиться

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

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

1
ответ дан 8 December 2019 в 18:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: