Что случилось с моим переключателем? Теперь результат:
< more > less = equality != no't equality
Как и должно быть:
< more = equality <?php $page = 99; switch ($page) { case $page < 121: echo '< more <br/>'; case $page > 123: echo '> less <br/>'; case $page == 99: echo '= equality <br/>'; case $page != 99: echo '!= no\'t equality <br/>'; } ?>
В вашем заявлении switch вы сравниваете число с логическими значениями.
Возьмем первый случай. $page < 121
true
, поэтому сравнение имеет значение 99==true
которое true
соответствии с http://docs.php.net/language.types.type-juggling ( переключатель выполняет свободное сравнение , а не строгим, как === ). Таким образом, выполняется первый блок case.
И так как у вас нет оператора break, он переходит к следующему блоку блока, а следующий и так далее …
Значение: Это не будет работать так, как предполагалось, независимо от того, используете ли вы break
или нет.
Вы, похоже, не понимаете, как работает коммутатор. То, что вы хотите, – это последовательность утверждений if, т.е.
if ($page < 121) echo '< more <br/>'; if ($page > 123) echo '> less <br/>'; if ($page == 99) echo '= equality <br/>'; if ($page != 99) echo '!= no\'t equality <br/>';
Коммутатор должен использоваться только тогда, когда вы хотите сравнить переменную с набором значений.
switch ($variable) { case "me": echo "variable is me"; break; case "you": echo "variable is you"; break; default: echo "Variable is neither of us"; }
Вышеупомянутый блок блокировки коммутатора можно записать, как показано ниже:
if ($variable=="me") { echo "variable is me"; } elseif ($variable=="you") { echo "variable is you"; } else { echo "variable is neither of us"; }
Не размещайте выражение рядом с оператором case.
switch ($somethng) { case $something < 10: break; case $something > 20: break; }
Коммутатор предназначен для использования только для сравнения переменной с набором значений. ТОЛЬКО! Для всего остального используйте инструкцию if … elseif..else.
Блок выше – неправильное использование. Иногда может быть правдой более одного из этих выражений.
$var = "cat"; switch($var) { case "cat": echo 'My '.$var.' is called Bob.'; break; case "dog": echo 'My '.$var.' is called James.'; break; default: echo "I don't have an animal"; break; }
В statemant переключателя вы сравниваете $ var против значения в случае. Если есть совпадение, фактический случай будет выполнен, в противном случае будет выполнен по умолчанию. Вы не можете использовать <>! = … в одном случае только значения: 1, '1', 'dog', $ var2 и т. Д.
Если вы хотите запустить ту же команду для двух случаев, вы можете сделать:
$var = "cat"; switch($var) { case "cat": case "dog": echo 'My '.$var.' is called James.'; break; default: echo "I don't have an animal"; break; }
В вашем коде вы забыли поставить перерыв; в конце каждого случая, поэтому вы видите «все» в своем выпуске. И вы пропускаете по умолчанию: тоже.
Для задачи, которую вы выполняете, я предлагаю вам использовать инструкции if.
если я не ошибаюсь, вы не можете использовать эти символы <> raw в html. вместо этого использовать сущности & gt; и & lt;.
если вы запустите скрипт в командной строке, я получил следующий вывод.
<?php ob_start(); $page = 99; switch ($page) { case $page < 121: echo '< more <br/>'; case $page > 123: echo '> less <br/>'; case $page == 99: echo '= equality <br/>'; case $page != 99: echo '!= no\'t equality <br/>'; } $buffer = ob_get_clean(); echo str_replace('<br/>', "\n", $buffer);
вывод
< more > less = equality != no't equality
который, по-видимому, является правильным поведением.
Важно понять, как выполняется оператор switch, чтобы избежать ошибок. Оператор switch выполняет строку за строкой (фактически, оператор-оператор). В начале код не выполняется. Только когда оператор case найден со значением, которое соответствует значению выражения switch, PHP начинает выполнять инструкции. PHP продолжает выполнять инструкции до конца блока коммутатора или в первый раз, когда видит оператор break.
«; ломать; case $ page> 123: echo '> less
«; ломать; case $ page == 99: echo '= равенство
«; ломать; case $ page! = 99: echo '! = no \' t равенство
«; ломать; default: echo 'Default'; }?>