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你可能想避免在某些情况下故意提供它们)。