我们正在尝试为我们的团队实施新的编码风格指南,当没有找到“中断”时,php codeniffer会在switch case语句上打印警告:
switch ($foo) {
case 1:
return 1;
case 2:
return 2;
default:
return 3;
}
是否有充分的理由使用:
switch ($foo) {
case 1:
return 1;
break;
}
??永远不会到达休息日?
答案 0 :(得分:77)
从break
return
switch
时遗漏break
完全有效。
但将case
作为defensive programming练习添加到每个switch ($foo) {
case 1:
return 1;
break;
case 2:
return 2;
break;
}
是相当普遍的做法。
case 1
我们的想法是,如果您以后更改break
中的代码并删除return语句,则可能会忘记添加case 2
。
这会不小心导致程序流量降至switch ($foo) {
case 1:
somethingDifferent();
case 2:
return 2;
break;
}
。
switch ($foo) {
case 1:
somethingDifferentAndWeWantToDoCase2AsWell();
// fallthrough
case 2:
return 2;
break;
}
通过案例陈述有点不寻常,你应该在你的代码中添加注释,以表明它是有意的。
{{1}}
与许多防御性编程实践一样,您必须平衡代码是否膨胀 - 这可能会使您的代码混乱并使其可读性降低 - 是否值得。
答案 1 :(得分:4)
如果您的“php codesniffer正在打印警告”,请尝试获取另一个更好的代码,并且不要忘记尝试使用上一个PHP稳定版本。当然,你可以在break
之后写一个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"
在我看来,这更简单,更好:更少的线=>减少维护的代码: - )
答案 2 :(得分:3)
我有更好的解决方案。请按照以下代码进行上述切换语句:
$result = 3; // for default case
switch ($foo) {
case 1:
$result = 1;
break;
case 2:
$result = 2;
break;
default:
// do nothing
}
return $result;
它不会导致任何错误,代码也适用于概念。
答案 3 :(得分:3)
要回答你的问题,没有任何理由不能做任何事情。以这种方式思考,在return
而不是break
说“不要忘记”之后的评论将具有相同的影响 - 无。这样说听起来很傻,对吧?
除非您需要将var设置为稍后使用,否则我建议您使用的方法非常好。我知道代码的意图在2秒内看到它。拥有break
只会造成混乱。
真的没有一种尺寸适合所有人。正确的方法取决于哪种情况适合。在每个case
中设置一个变量,并且break
可能是正确的方法,或者只是返回有意义。
对答案中提出的其他建议的一些看法:
1) break
之后没有return
表示如果稍后更改代码可能会出现问题
只要有可能,代码应该是明确的,并且可读且清晰。我们还可以通过编码方式使未来的更改变得更容易。但是在switch
之类的简单内容中,它应该没有问题,并且不需要安全网来重构case
以后添加或删除return
或break
。
事实上,如果您删除了return
并且“没有注意到没有break
”那么这是一个很糟糕的错误,可以在任何部分制作编码。没有问题检查将为您节省开支。一个人应该非常谨慎地编写未来的潜力,因为这种潜力可能永远不会发生,或者其他可能发生的事情,并且你最终会在几年内维护过时的代码。
同样地,这被认为是未来变化的安全网 - 如果您移除return
并且意外地离开安全网break
,那么该怎么办?
即使这个转换语句是生死攸关的场景,真的很严重的代码,我也反对在返回后添加“毫无意义”的中断。只要确保那些正在编写代码的人知道他们在做什么,并且需要经过足够的眼睛审查代码并进行全面测试 如果是那么严重的话,那么你会有一个额外的检查,比建议的安全网更好地抓住草率的开发者。
认为返回后的中断增加了一个安全网,意味着你没有正确编码或测试。如果这是一个被认为有用的安全网,那么代码中可能存在大量的错误,可能是更严重的地方。
“防御性编程”的维基文章被链接到了,但它与此无关:
防御性编程是一种旨在确保防御性设计的形式 不可预见的一个软件的持续功能 情况。
离开安全网break
不是不可预见的情况,也不是防御性编程。这只是糟糕的编码,并且您不能使用备份代码来丢弃代码,以防您在更改内容时无法正确编码。这是一种糟糕的编码方法。 “如果某人被删除则返回它将无法正常工作”这一论点,你也可能在案例var中输入错误,或者忘记写案例,或者......
return
返回,并且您没有“防御性”编码以避免返回失败。那将意味着PHP被打破了,你不能用安全网填写你的代码以满足这一要求。这是你在更高层次上的东西。
break
保持明确后 2) return
但这显然是错误的。 return
返回,因此不会发生中断。对我而言,这是一个刮擦头的时间,想知道我是否已经错过了意图 - 不久就会明白会发生什么,但是会有一个时刻我会思考它以确保我没有错过了什么。
虽然在同一return
中拥有break
然后case
并非无效或错误,但由于break
无效,因此完全毫无意义。它是无意义的代码,需要被看到,维护和计算出来,因为它不合逻辑。
如果显式是并且在break
之后有return
的核心目标,因为它没有意义,那么我会说最好设置变量和break
,然后在断开开关后返回变量
就像@RageZ回答https://stackoverflow.com/a/1437476/2632129
3) 设置变量并在switch语句完成后返回
这种方法完全没有问题,但如果没有理由将值存储在变量中(稍后使用等),那么当没有必要再做任何其他事情时,立即返回是很好的。
显示明确的意图 - 一旦案件匹配就返回一个值。
答案 4 :(得分:-1)
我不是完美编码的专家,但我认为验证者更喜欢这样的东西
switch ($foo) {
case 1:
$ret = 1;
break;
case 2:
$ret = 2;
break;
default:
$ret = 3
}
return $ret
我认为在case语句中使用return来打破代码流并不是最佳实践。这就是为什么验证者说没有休息......
关于类别的问题,我不知道......对不起
答案 5 :(得分:-11)
从PHP手册(http://us3.php.net/manual/en/control-structures.switch.php):
PHP继续执行语句,直到switch块结束,或者第一次看到break语句。如果你不在case语句列表的末尾写一个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将执行所有的echo语句!如果$ i等于1,PHP将执行最后两个echo语句。只有当$ i等于2时,才会得到预期的行为('i等于2')。因此,重要的是不要忘记break语句(即使你可能想在某些情况下避免故意提供它们) )。