Переключатель PHP и логическое управление регистром - PullRequest
1 голос
/ 17 октября 2011

Возможно ли иметь логическое управление делом?

т.е.:

$v = 0;
$s = 1;

switch($v)
{
    case $s < $v:
        // Do some operation
        break;
    case $s > $v:
        // Do some other operation
        break;
}

Есть ли способ сделать что-то подобное?

Ответы [ 4 ]

5 голосов
/ 15 мая 2014

Условие, которое передается для переключения, - это значение, с которым сравниваются случаи.Условие (в вашем вопросе $ 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 - это запасной вариант, и его позицияне имеет значения.

Примечание: вышеупомянутые переключатели являются нечеткими и эзотерическими и предоставляются только в качестве доказательства.

2 голосов
/ 17 октября 2011

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

$ s <$ v оценивается как false, что срабатывает на $ v, потому что здесь 0. </p>

1 голос
/ 17 октября 2011

Не самое читаемое использование, но да, вы можете.

Используйте структуру if / else - if / elseif / else, если вам нужно просто простое сравнение.

0 голосов
/ 17 октября 2011

http://php.net/manual/en/control-structures.elseif.php

if ($a > $b) {
    echo "a is bigger than b";
} elseif ($a == $b) {
    echo "a is equal to b";
} else {
    echo "a is smaller than b";
}
...