我的开关出了什么问题? 现在结果:
< 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/>';
}
?>
答案 0 :(得分:13)
在你的switch语句中,你将一个数字与布尔值进行比较
我们假设第一个案例$page < 121
为true
,因此根据http://docs.php.net/language.types.type-juggling 99==true
进行比较true
break
执行松散的比较,不像switch那样严格。因此执行第一个案例块
由于你没有===语句,它会进入下一个案例块和下一个案件块,等等......
含义:无论您是否使用{{1}},这都不会按预期工作。
答案 1 :(得分:8)
您似乎不了解交换机的工作原理。你想要的是一系列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/>';
答案 2 :(得分:5)
仅当您想要将变量与一组值进行比较时才使用切换。
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;
}
Switch仅用于将变量与一组值进行比较。只要!对于其他所有内容,请使用if ... elseif..else语句。
上面的块是错误的用法。有时,这些表达中不止一个可能是真的。
答案 3 :(得分:1)
$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;
}
在switch state中,将$ var与case中的值进行比较。如果匹配,将执行实际情况,否则将执行默认情况。您不能在案例中使用&lt;&gt;!= ...,只能使用以下值: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语句。
答案 4 :(得分:0)
如果我没错,你就不能使用这个字符&lt; &GT;原始的HTML。而是使用实体&amp; gt;和&amp; 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语句按顺序执行 避免错误。开关 语句逐行执行 (实际上,声明中的声明)。在 一开始,没有代码被执行。 仅在找到案例陈述时 具有与值相匹配的值 PHP开始的开关表达式 执行声明。 PHP 继续执行这些陈述 直到开关块结束,或 它第一次看到休息 言。
答案 5 :(得分:-1)