我们正在尝试为我们的团队实现新的编码风格指南,当没有找到"break"时,php codeniffer会在switch case语句上打印警告:
switch ($foo) {
case 1:
return 1;
case 2:
return 2;
default:
return 3;
}
Run Code Online (Sandbox Code Playgroud)
有什么好的理由可以使用:
switch ($foo) {
case 1:
return 1;
break;
}
Run Code Online (Sandbox Code Playgroud)
?? 永远不会到达休息日?
Joh*_*ter 86
break
当你return
从一个人那里离开时,完全有效switch
.
但是它是相当常见的做法是明确的添加break
s到每case
一个防御性的编程实践.
switch ($foo) {
case 1:
return 1;
break;
case 2:
return 2;
break;
}
Run Code Online (Sandbox Code Playgroud)
我们的想法是,如果您以后更改代码case 1
并删除return语句,您可能会忘记添加一个break
.
那会不小心导致程序流程掉进去case 2
.
switch ($foo) {
case 1:
somethingDifferent();
case 2:
return 2;
break;
}
Run Code Online (Sandbox Code Playgroud)
落入案例陈述有点不寻常,您应该在代码中添加注释,以表明它是有意的.
switch ($foo) {
case 1:
somethingDifferentAndWeWantToDoCase2AsWell();
// fallthrough
case 2:
return 2;
break;
}
Run Code Online (Sandbox Code Playgroud)
与许多防御性编程实践一样,您必须平衡代码是否膨胀 - 这可能会使代码混乱并使其可读性降低 - 是否值得.
如果您的“php 代码嗅探器正在打印警告”,请尝试使用另一个更好的代码嗅探器,并且不要忘记尝试使用最新的 PHP 稳定版本。当然,你可以写一个break
after one return
,但这没有意义,因为它永远不会被读取。你的代码没问题。
看这个:
$fun = function(int $argument): string {
switch ($argument) {
case 1:
return "one";
case 2:
return "two";
default:
return "more than two";
}
};
$str = $fun(4); // return "more than two"
Run Code Online (Sandbox Code Playgroud)
在我看来,这更简单更好:更少的行 => 更少的代码维护:-)
要回答您的问题,没有充分的理由去做一些什么都不做的事情。这样想,在 之后的评论return
而不是break
说“不要忘记”将具有相同的影响 - 没有。这么说听起来很傻,对吧?
除非您需要设置一个 var 以供以后使用,否则我建议您采用的方法非常好。我在查看代码的 2 秒内就知道代码的意图。有一个break
公正会造成混乱。
没有一种尺寸适合所有人。正确的方法取决于适合场景的方法。在每个变量中设置一个变量case
并使用 abreak
可能是正确的方法,或者也许只是 return 有意义。
对答案中其他建议的一些观察:
1) 没有break
afterreturn
意味着如果以后更改代码可能会出现问题
只要有可能,代码应该是明确的,以及可读和清晰的。我们还可以通过某种方式编写代码,使将来的更改更容易。但是在像 aswitch
这样简单的事情中,它应该没问题,并且不需要安全网来重构 acase
以后添加或删除 areturn
或break
。
事实上,如果您删除了 areturn
并且“没有注意到没有break
”,那么这是一个糟糕的错误,并且可能在编码的任何部分发生。没有任何问题检查可以避免您这样做。并且应该非常小心地为未来的潜力编码,因为这种潜力可能永远不会发生,或者其他事情可能会发生,而你最终只会维护过时的代码多年。
同样,这也被认为是未来变化的安全网——如果你在本应该移除它的时候把它拿掉了return
,但不小心留在了那个安全网里break
怎么办?
即使这个 switch 语句是生死攸关的场景,真正严肃的代码,我也反对在返回后添加“毫无意义”的中断。只要确保编写代码的人都知道他们在做什么,并且代码经过足够多的人审查并经过全面测试。
如果情况如此严重,那么您将有比提议的安全网更好的额外检查来捕获草率的开发人员。
争论返回后中断会增加安全网,意味着您没有正确编码或测试。如果这是一个被认为有用的安全网,那么代码中可能存在大量潜在更严重的错误。
“防御性编程”的维基文章被链接到,但这里不相关:
防御性编程是一种防御性设计形式,旨在确保在不可预见的情况下软件的持续功能。
留下安全网break
不是不可预见的情况,也不是防御性编程。这只是糟糕的编码,你不能用备份代码乱扔你的代码,以防你在改变某些东西时没有正确编码。这是一种非常糟糕的编码方法。“如果有人删除返回它不起作用”的论点,那么你也可能在 case var 中有错字,或者忘记写 case,或者......
该return
回报的,你不编码“防守”,以避免一回失败。这意味着 PHP 已损坏,并且您不会用安全网填充您的代码来满足这一点。这是你在更高层次上的东西。
2) break
在return
保持明确之后
但这显然是错误的。的return
回报,所以破就不会发生。对我来说,这是头疼的时间,想知道我是否错过了意图 - 不是很清楚会发生什么,但会有一段时间我会思考它以确保我没有错过任何东西。
虽然在同一个 中使用return
and then并不是无效或错误,但它完全没有意义,因为什么都不做。这是无意义的代码,需要查看、维护和弄清楚,因为它不合逻辑。break
case
break
如果显式是核心目标并且有一个break
after a return
urks 你因为它毫无意义,那么我会说最好设置一个变量 and break
,然后在断开开关后返回变量。
像@RageZ 回答/sf/answers/100623351/
3) 设置一个变量,switch语句完成后返回
这种方法完全没有错,但是如果没有理由将值存储在变量中(以后使用等),那么当不需要做任何其他事情时立即返回是很好的。
这表明了明确的意图 - 一旦案例匹配就返回一个值。