break; vs continue; vs return;

32

我从 hotscripts.com 下载了一份用 PHP 写的免费的新闻订阅。

我稍微更新了一下代码以添加新功能,但看到了一些我不理解的东西。

在代码中,我看到了:

foreach() { ...
 if() ...
  break;
 elseif() ...
  continue;
}

我也看到过:

function() {
// ...
for($nl = 0; ...
 if() ...
  return true;
}

我读到break;会停止循环,continue会跳过循环到下一次迭代,return会退出函数。

我不明白的是为什么要编写那样的代码风格?为什么不使用类似于:

function() {
// ...
 for($nl = 0; ...
  if() ...
   $returnValue = true;
  else {
   $returnValue = false;
  }
 }
 return $returnValue;
}

或者在for循环中有相同的想法吗?

3个回答

40

使用像 breakcontinue 这样的关键字可以使代码比你提出的更易读。

特别是如果您嵌套 if/else 语句多个级别。

比较本帖子下面的片段,哪一个更容易阅读? 它们都输出完全相同的内容,而 $Aarray(1,2,4,4,3,4)

在循环中(函数内部)使用 return 可以节省宝贵的 CPU 循环,如果你知道不需要再循环,为什么还要这样做呢?


我太酷了,不使用break/continue..

$not_even_found = false;

foreach ($A as $v) {
  if ($v != 1) {
    if ($not_even_found) {
    } else if ($v % 2 != 0) {
      $not_even_found = true;
    } else {
      echo "$v\n";
    }
  }
}
我想要有易读的代码...
foreach ($A as $v) {
  if ($v == 1)
    continue;

  if ($v % 2 != 0)
    break;

  echo "$v\n";
}

如果 + continue 是别有用心的,那它确实强调了这一点。孩子们在家可不要这么做 :) - Jason McCreary
这是一个很好的解释,只有两点需要注意:1)在if语句后始终使用花括号。2)使用!==而不是!= - Nicola Peluchetti
3
@NicolaPeluchetti,花括号仅仅是一种风格偏好,我更喜欢在单语句控件中不使用它们,就像所示的那样排除它们......不要用不必要的代码堵塞我的屏幕 :) - Jared

13

你使用这种风格编码是为了在第一次满足条件时节省不必要的循环,因为你已经知道某些条件为真,所以无需进一步调查。

事实上,如果你返回,你就停止了循环。以下是一个愚蠢的例子:

function in_array($needle, $haystack){
   for($i = 0; $i < count($haystack); i++){
      if($needle === $haystack[$i]{
          return $i;
      }
   }
   return -1;
}

在这种情况下,当条件得到满足时,你会返回某个值(例如true或者在此情况下是计数器的值),因为你不需要遍历整个数组。


@Nicola Peluechetti,return 之前使用 unset($haystack) 是否有助于释放内存? - Benn
1
@Benn 我不认为这会有任何改变,因为内存是垃圾回收的,所以取消设置不会带来任何好处。在我看来。 - Nicola Peluchetti
@LloydMoore 你的意思是“少即是多”吗? - Ömer An

0

其中一些原因是出于个人偏好。另一些原因则取决于在返回之前是否需要在同一函数中完成其他任务。如果没有其他需要完成的任务,而该函数只需返回一个真或假的答案,则直接使用return true;是最快捷的机制。如果您仍然需要在决定是否返回true之后执行其他操作(例如关闭文件句柄),则将响应分配给变量,然后在最后返回可能是必要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接