PHP中的GOTO命令?

时间:2008-08-21 05:58:00

标签: php language-features goto

我听说有传言称PHP正计划引入“goto”命令。应该做什么?

我尝试了一下,但没有找到任何描述性的东西。我知道它不会是“GOTO 10” - 就像命令......

7 个答案:

答案 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 笑话。做你的脚趾。

另见:

http://www.php.net/~derick/meeting-notes.html#adding-goto

答案 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)

looks就像它目前在PHP 5.3中一样,但尚未完全记录。从我可以告诉它与C共享它的goto语法,所以它应该很容易上手和使用。请记住Dijkstra的warning并仅在必要时使用它。

答案 5 :(得分:0)

@ steveth45

我的经验法则是,如果您的嵌套代码深度超过3级,那么您就是这样做的 出了点问题。

然后您不必担心使用多个break语句或转到:D

答案 6 :(得分:0)

php中有goto - &gt; http://php.net/manual/en/control-structures.goto.php,但我不会使用它,只需编写普通代码......