Условие, которое передается для переключения, - это значение, с которым сравниваются случаи.Условие (в вашем вопросе $ v) оценивается один раз, а затем PHP ищет первый случай, который соответствует результату.
Из руководства (после Примера № 2), выделение добавлено:
Оператор switch выполняет построчно (фактически оператор за оператором).В начале, код не выполняется. Только когда оператор case найден со значением, совпадающим со значением выражения switch , PHP начинает выполнять операторы.PHP продолжает выполнять операторы до конца блока switch или до того момента, когда он впервые видит оператор break.
В вашем вопросе switch ($v)
такой же, как если бы вы написали: switch (0)
, потому что $v = 0
.Затем ваш коммутатор попытается найти случай, равный 0. И так же, как @ Крис сказал, :
$ s <$ v оценивается как ложное, что вызывает$ v, потому что здесь 0. </p>
Если вам нужно использовать условия в операторах case, ваше switch-условие должно быть логическим, например:
$v = 0;
$s = 1;
switch (true) {
case ($s < $v):
echo 's is smaller than v';
break;
case ($s > $v):
echo 's is bigger than v';
break;
}
Теперь ваш коммутатор пытается найти первый случай, который оценивается как true
, который в этом случае будет $s > $v
.
Обратите внимание, что хотя условие переключения оценивается только один раз, случаикаждый оценивается по порядку:
$a = 1;
switch ($a) {
case 2:
echo 'two';
break;
case (++$a > 2):
break;
default:
echo $a;
}
выводит '2' из case-case, потому что при сравнении $ a с "2" $ a равнялся 1, и регистр отбрасывался;while:
$a = 1;
switch ($a) {
case (++$a > 2):
break;
case 2:
echo 'two';
break;
default:
echo $a;
}
повторяет 'two' из регистра '2', поскольку ++$a > 2
увеличивает $ a, но не соответствует $ a.
default
- это запасной вариант, и его позицияне имеет значения.
Примечание: вышеупомянутые переключатели являются нечеткими и эзотерическими и предоставляются только в качестве доказательства.