Что происходит с этим переключателем php при использовании isset в кейсе? - PullRequest
0 голосов
/ 21 февраля 2012
$a = true;
//b is unset;

switch(true) {
    case ($a): echo 'a';
    case (isset($b)): echo 'b';
    default: echo 'c';
}

//outputs 'abc'. expected output is 'bc'

Почему вывод не такой, как ожидалось?

Обновление: ожидаемый вывод 'bc' является опечаткой и должен читать 'ac'.

Обновление: теперь я вижу, как этот код выдает результат, отличный от ожидаемого. КАЖДАЯ секция кода в блоке переключателей после первого случая, возвращающего значение true, будет выполнена, если только переключение не завершено разрывом. После точки останова никакие другие случаи не будут проверены. Вот где моя ошибка была, поскольку я ожидал, что тестирование будет возобновлено в случае отсутствия операторов прерывания.

Ответы [ 4 ]

1 голос
/ 21 февраля 2012

Я понятия не имею, почему вы ожидаете, что на выходе будет bc, когда вы четко установили $a на true. Вы сравниваете true == true, что, очевидно, будет положительным сравнением.

Что за оператор switch принимает значение, а затем сравнивает его со значениями, заданными операторами case. Вход для обоих может быть выражением. Как только сравнение будет положительным, код выполняется до тех пор, пока не встретится break или не будет достигнут конец оператора switch.

Итак, чтобы сломать ваш код:

$a = true;

switch(true) {
    case ($a):  // $a == true, which is the case so we start to execute
      echo 'a'; 
    case (isset($b)): // isset($b) == true, which is not the case, but we still continue because of the lack of a break;
      echo 'b';
    default: echo 'c'; // again, we get here because there is no break;
}
1 голос
/ 21 февраля 2012

Код, написанный Исиусом, правильный.Это просто хороший трюк, чтобы выяснить, какой из следующих случаев является правдой.

Ваш код не работает должным образом, потому что вы не ставили оператор break для каждого случая.

Это должно выглядеть так:

$a = true;
//b is unset;

switch(true) 
{
    case ($a): 
            { 
            echo 'a'; 
            break;
             }

    case (isset($b)): 
            { 
            echo 'b'; 
            break; 
            }

    default:  echo 'c';
}

Вывод:».Я не знаю, почему вы ожидаете получить вывод "bc".

0 голосов
/ 21 февраля 2012

Я не уверен, что вы пытаетесь сделать здесь, но я думаю, что вы немного запутались в том, как работает оператор switch.Оператор switch - это, по сути, более элегантный способ иметь много операторов IF.Так что, если у вас есть переменная $ a и вы хотите выполнить какую-то логику в зависимости от ее значения, вы можете сделать это, используя операторы IF или условные выражения.Например:

//WITH IF STATEMENTS
if($a == 1) {
     echo "the value was 1";
}
else if($a == 2) {
     echo "the value was 2";
}
else { 
     echo "the value was not 1 or 2";
}

//WITH SWITCH STATEMENT
switch($a) {
   case 1:
      echo "the value was 1";
      break; //the break stops it just going onto the next case
   case 2: 
      echo "the value was 2";
      break;
   default: //this happens if none of the previous cases are true
      echo "the value was neither 1 or 2"

Вы не можете включить true, хотя true не имеет значения для включения - это просто true.

0 голосов
/ 21 февраля 2012

Это довольно нечитабельно и не имеет смысла.

Это не так, как работают операторы switch.

...