PHP编码样式返回; 在开关/情况下

我们正试图为我们的团队实施新的编码风格指南,php codesniffer在没有发现“break”的情况下在switch case语句上打印警告:

switch ($foo) { case 1: return 1; case 2: return 2; default: return 3; } 

有什么好的理由使用:

  switch ($foo) { case 1: return 1; break; } 

?? rest是永远不会到达?

switch return时忽略break是完全有效的。

但是,作为一种防御性的编程习惯,在每个case增加明确的break是相当普遍的做法。

 switch ($foo) { case 1: return 1; break; case 2: return 2; break; } 

这个想法是,如果你以后在case 1更改你的代码并删除了返回语句,你可能会忘记添加一个break

这将意外地导致程序stream向case 2

 switch ($foo) { case 1: somethingDifferent(); case 2: return 2; break; } 

通过案件陈述落空是有点不寻常的,当你这样做的时候,你应该给你的代码添加一个评论,以表明这是有意的。

 switch ($foo) { case 1: somethingDifferentAndWeWantToDoCase2AsWell(); // fallthrough case 2: return 2; break; } 

与许多防御性编程实践一样,您必须平衡代码是否膨胀 – 这可能会混淆代码并使代码变得不可读 – 是否值得。

我有更好的解决scheme。请按照以下代码为上述开关统计:

 $result = 3; // for default case switch ($foo) { case 1: $result = 1; break; case 2: $result = 2; break; default: // do nothing } return $result; 

它不会导致任何错误,并且代码对概念也很好。

如果您的“php codesniffer正在打印警告”,请尝试获得另一个更好的codesniffer,不要忘记尝试使用最后的PHP稳定版本。 当然,你可以在一次return之后写一个break ,但是没有意义。 因为永远不会阅读。 你的代码是好的。

看这个:

 $fn = function($ar) { switch ($ar) { case 1: return "uno"; case 2: return "two"; default: return "mehr als zwei"; } }; $str = $fn(4); // return "mehr als zwei" 

这是简单和更好的。 less线=>less代码维护:-)

我不是完美编码方面的专家,但我认为validation者会喜欢这样的东西

 switch ($foo) { case 1: $ret = 1; break; case 2: $ret = 2; break; default: $ret = 3 } return $ret 

我认为在case语句中使用return来打破代码stream并不是一个最好的实践。 所以这就是validation者说没有任何突破的原因

对于你的类别问题,我不知道…对不起

从PHP手册( http://us3.php.net/manual/en/control-structures.switch.php ):

PHP继续执行语句直到交换机块结束,或者第一次看到break语句。 如果您在案例的声明列表末尾没有写入break语句,则PHP将继续执行以下情况的语句。 例如:

 <?php switch ($i) { case 0: echo "i equals 0"; case 1: echo "i equals 1"; case 2: echo "i equals 2"; } ?> 

在这里,如果$ i等于0,PHP将执行所有的回声语句! 如果$ i等于1,PHP将执行最后两个回声语句。 只有当$ i等于2时,你才会得到预期的行为('我等于2')。因此,不要忘记break语句(尽pipe你可能想避免在某些情况下故意提供它们)。