PHP编码样式返回;在开关/箱子里

时间:2009-09-17 08:26:07

标签: php coding-style

我们正在尝试为我们的团队实施新的编码风格指南,当没有找到“中断”时,php codeniffer会在switch case语句上打印警告:

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

是否有充分的理由使用:

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

??永远不会到达休息日?

6 个答案:

答案 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以后添加或删除returnbreak

事实上,如果您删除了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语句(即使你可能想在某些情况下避免故意提供​​它们) )。