我已经测试了它并且它工作正常,但它看起来......很奇怪......对我而言。我是否应该担心这是非标准格式,将在PHP的未来版本中删除,或者它可能会停止工作?我总是有一个默认案例作为最后一个案例,从来不是第一个案例......
switch($kind)
{
default:
// The kind wasn't valid, set it to the default
$kind = 'kind1';
// and fall through:
case 'kind1':
// Do some stuff for kind 1 here
break;
case 'kind2':
// do some stuff for kind2 here
break;
// [...]
case 'kindn':
// do some stuff for kindn here
break;
}
// some more stuff that uses $kind here...
(如果不明显我要做的是确保$ kind有效,因此默认:case。但是交换机也会执行一些操作,然后在切换后使用$ kind。这是为什么默认:落到第一种情况,并设置$ kind)
连连呢?这是正常/有效的语法吗?
答案 0 :(得分:22)
这是一种不同寻常的习语,当你阅读它时会引起一点停顿,这是一个“嗯?”的时刻。它有效,但大多数人可能希望在最后找到默认情况:
switch($kind)
{
case 'kind2':
// do some stuff for kind2 here
break;
// [...]
case 'kindn':
// do some stuff for kindn here
break;
case 'kind1':
default:
// Assume kind1
$kind = 'kind1';
break;
}
答案 1 :(得分:9)
如果有人像我一样通过谷歌找到这个页面:
我和Josh一样想知道 - 所以...... 有一件事是标准,我认为我们都应该更加努力地坚持,但另一件事是黑客攻击(在:利用每种可能性的方式)。
虽然它很丑/很奇怪/不正常 - 这是可能的,恕我直言可能在一些罕见的情况下有用......
请考虑以下事项:
$color = "greenish";
//$color = "green";
switch($color) {
default:
echo "no colors were selected so the color is: ";
case "red":
echo "red<br />\n";
break;
case "blue":
echo "blue<br />\n";
break;
case "green":
echo "green<br />\n";
break;
}
如果$color = "greenish";
代码将打印
未选择任何颜色,因此颜色为红色
如果$color = "green";
或任何其他定义的情况,它只会打印颜色。
它知道这不是最好的例子,但你明白了;) 希望它对某人有所帮助。
答案 2 :(得分:4)
这就是我可能会这样做的方式......它很容易实现并保持功能。
switch($kind)
{
case 'kind1': default :
// Do some stuff for kind 1 here
break;
case 'kind2':
// do some stuff for kind2 here
break;
case 'kindn':
// do some stuff for kindn here
break;
}
答案 3 :(得分:4)
与
相同的原因看起来很奇怪else {
echo "lol";
}
if (1 == 1) {
echo "bbq";
}
如果有效的话,它会看起来很奇怪。如果仅仅因为这个原因我就会避免它。
此外,你知道每次你向某人展示代码时,你将不得不解释将default
案件放在第一位是故意的;这通常表明这不是一个好主意。
答案 4 :(得分:3)
我个人更喜欢做
switch($kind)
{
case 'kind2':
// do some stuff for kind2 here
break;
// [...]
case 'kindn':
// do some stuff for kindn here
break;
case 'kind1':
default:
$kind = 'kind1'; // Redundant if it's already set as 'kind1', but that doesn't make any difference to the code.
// Do some stuff for kind 1 here
break;
}
答案 5 :(得分:2)
通常的做法是将默认选项定义为最后一个选项。但我认为您的解决方案没有任何问题(如果贵公司没有预定义架构如何布局代码)
答案 6 :(得分:2)
一开始有点让我烦恼,但那只是因为我们不习惯那样看东西。
我建议您高度记录这一点,因为有些人可能称之为“棘手”的代码。一个菜鸟或一些未来的维护者可能会把它移到底部,在那里他们对它更加舒服并且打破了顶部的副作用。
答案 7 :(得分:2)
这对于流量控制来说非常方便,特别是如果你没有在两种情况下分开。
例如:
$step = $_GET['skip_to_step'];
switch($step) {
default:
case 'step1':
// do some stuff for step one
case 'step2':
// this follows on from step 1 or you can skip straight to it
}
您可以在开始切换之前添加额外的“if”或“聪明”或“使$step
默认为'step1'
,但这只是额外的代码,降低了可读性。” >
答案 8 :(得分:1)
其他答案给出了很好的例子,只是为了清楚起见......
除非包含中断,否则案例(包括默认值)不会在其结尾处停止执行。虽然开关经常与if elseifif等序列进行比较,但它并不完全相同。
简短版本: SWITCH / CASE仅在IF / ELSEIF / ELSE 中起作用,如果在每种情况后都包含中断。 SWITCH / CASE更像是一系列&#34; if&#34;每个具有相同变量的语句,使用不同的值进行检查。
长版本:不包含中断,每个案例都是&#34;从这里开始&#34;并且在很多方面的差异使它更接近GOTO而没有缺点。从技术上讲,如果你真的非常想(阅读,是一个想要真正挑战自己的受虐狂编码人员),你几乎可以只使用一个外部数组,一个for循环和一个嵌套在里面的开关来编写任何程序程序。
说真的,你为什么要这样做会令我难以置信,但它确实展示了切换/案例与if / elseif模式的偏差有多远,所以出于学术原因它会在这里出现(但不要#39)这样做!)......
$array = [];
$array['masterLoop'] = 1;
$for ($i = 0, $i < $array['masterLoop'], $i++ ){
switch($array['goto']){
default:
case 1:
PRINT: "Welcome to the program";
case 2:
PRINT: "Please make a choice:";
case 3:
$array['choice']='';
// Wait for some input variable and set choice to it.
case 4:
$array['goto']=$array['choice'];
$array['masterLoop']++;
}
}
此代码运行的方式(在您设置捕获和设置选项之后)将启动
"Welcome to the program. Please make a choice."
<<user inputs 2>>
"Please make a choice."
<<user inputs 1>>
"Welcome to the program. Please make a choice."
<<user inputs 3>>
// program awaits user input
<<user inputs 4>>
// user triggers infinite loop
所以......你可以用开关来反映BASIC的时代...... 但是,如果你这样做,我必须在你写完代码之后调试你的代码... May Linus Torvalds怜悯你的灵魂。