在PHP中,使用break
和continue
作为循环的哨兵是一种好的实践吗?
例如:
if (!empty($var))
break;
在PHP中,使用break
和continue
作为循环的哨兵是一种好的实践吗?
例如:
if (!empty($var))
break;
do {
if (condition1)
break;
some code;
some code;
if (condition2)
break;
some code;
some code;
if (condition3)
break;
some code;
some code;
} while (false);
对比。
if (!condition1) {
some code;
some code;
if (!condition2) {
some code;
some code;
if (!condition3) {
some code;
some code;
}
}
有些人认为第一个版本很难阅读并且不好,更喜欢第二个版本。而有些人则发现第一个版本更简洁易懂。随着条件的增加,我倾向于觉得第一个版本更易于理解,因为第二个版本嵌套层数越来越深,难度也越来越大。此外,如果if (condition) break;
变得稍微复杂一点,例如if (condition) {some code; break}
,则与等效的嵌套if相比,do {if .. break; if .. break..;} while(false)
模式会变得更加清晰。
break
和 continue
基本上只是受限制的goto
,因此请谨慎使用。没错,它们都是有效的编程结构。
不过,新引入的GOTO并不是一个好主意。(请告诉我这只是我没有看到关于愚人节玩笑的说明!)
break n
或continue n
比同时操作多个变量更简单。 (尽管这种用例可能是最具争议性的...)让我用几个问题来回答:
为什么不应该被视为良好的实践?
它是否降低了代码的可读性?
它是否会减慢您的循环速度?
关于PHP中的break和continue(以及循环语句),请参阅高级循环 - 你会得到这样的印象,作者似乎刚刚掌握了break和continue,但还没有掌握break n 和 continue n。 :-)
在我五年多的 PHP 编程经验中,我从未在 switch 语句之外使用过 break。
continue 有时用于跳过迭代中的第一个或最后一个项目,但我不太喜欢它。
他们为什么要重新引入 GOTO?这太糟糕了。
回答这个问题,在
if (!empty($var))
break;
为什么不在方法上下文中使用return?
if (!empty($var))
return false;
我认为这种方式更清晰,并使调用方了解内部发生了什么。参数错误的更好使用是使用异常,事实上,它们会在引发异常的地方中止执行。