我听说有传言称PHP正计划引入“goto”命令。应该做什么?
我尝试了一下,但没有找到任何描述性的东西。我知道它不会是“GOTO 10
” - 就像命令......
答案 0 :(得分:9)
他们没有添加真正的GOTO,而是扩展BREAK关键字以使用静态标签。基本上,它将增强打破 switch 嵌套if语句的能力。这是我发现的概念示例:
<?php
for ($i = 0; $i < 9; $i++) {
if (true) {
break blah;
}
echo "not shown";
blah:
echo "iteration $i\n";
}
?>
当然,一旦GOTO“谣言”消失,没有什么可以阻止一些邪恶的家伙传播额外的 COMEFROM 笑话。做你的脚趾。
另见:
答案 1 :(得分:6)
我总是对PHP设计师非常愚蠢而感到惊讶。 如果使用GOTO的目的是打破多重嵌套 循环更高效有一个更好的方法:标记代码块 和break语句可以引用标签:
a: for (...) {
b: for (...) {
c: for (...) {
...
break a;
}
}
}
现在很清楚退出哪个循环/块,退出是结构化的; 你无法用真正的东西来获得意大利面条代码。
这是一个古老的,古老的想法。设计良好的控制流程管理 自70年代以来,结构已经得到了解决,并且有关于这一切的文献 写完了很久。 Bohm-Jacopini定理表明了这一点 你可以使用函数调用,if-then-else和while循环来编写任何代码。 在实践中,打破深层嵌套的块,Bohm-Jacopini风格 编码需要额外的布尔标志(“设置此标志以退出循环”) 这是笨拙的编码明智和低效(你不想要这样的标志 在你的内循环中)。使用if-then-else,各种循环(while,for) 和break-to-labeled块,你可以编码任何算法,而不是没有 效率下降。为什么人们不读文学 复制C做了什么?哎呀。
答案 2 :(得分:3)
当然,我不是PHP程序员,我不知道PHP的GOTO实现会是什么样子,但这是我对GOTO的理解:
GOTO只是一个比任何其他更明确的流控制语句。假设您有一些嵌套循环,您只需找到一件事。你可以放入一个条件语句(或几个),当条件得到正确满足时,你可以使用GOTO语句来摆脱所有循环,(而不是在每个嵌套级别使用条件语句都有'break'语句对于每一个。是的,我相信传统的实现是使用GOTO语句可以按名称跳转的命名标签。你可以这样做:
for(...) {
for (...) {
for (...) {
// some code
if (x) GOTO outside;
}
}
}
:outside
这比没有GOTO语句更简单(也更有效)。相当于:
for(...) {
for (...) {
for (...) {
// some code
if (x) break;
}
if(x) break;
}
if(x) break;
}
在第二种情况下(这是常见的做法),有三个条件语句,这显然比只有一个条件语句慢。因此,出于优化/简化的原因,您可能希望在紧密嵌套的循环中使用GOTO语句。
答案 3 :(得分:1)
在steveth45给出的示例中,您可以改为使用函数:
function findItem(...) {
for (...) {
for (...) {
for (...) {
if (x) {
return theItem;
}
}
}
}
}
// no need for label now
theItem = findItem(a, b, c);
答案 4 :(得分:0)
答案 5 :(得分:0)
@ steveth45
我的经验法则是,如果您的嵌套代码深度超过3级,那么您就是这样做的 出了点问题。
然后您不必担心使用多个break语句或转到:D
答案 6 :(得分:0)
php中有goto
- &gt; http://php.net/manual/en/control-structures.goto.php,但我不会使用它,只需编写普通代码......