5

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

我尝试搜索了一下,但没有找到任何非常具有描述性的内容。我知道这不会是一个类似“ GOTO 10”的命令......

4

7 回答 7

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

于 2008-08-21T06:14:47.763 回答
6

我总是对 PHP 设计者的愚蠢程度感到惊讶。如果使用 GOTO 的目的是为了更有效地打破多重嵌套循环,那么有一个更好的方法:标记的代码块和可以引用标签的 break 语句:

a:  for (...) {
    b:  for (...) {
         c: for (...) {
               ...
               break a;
           }
       }
   }

现在很清楚要退出哪个循环/块,并且退出是结构化的;你不能像使用真正的 goto 那样获得意大利面条代码。

这是一个古老的,古老的,古老的想法。自 70 年代以来,设计良好的控制流管理结构就已经得到解决,关于这一切的文献早就写好了。Bohm-Jacopini 定理表明,您可以使用函数调用、if-then-else 和 while 循环编写任何代码。在实践中,为了打破深度嵌套的块,Bohm-Jacopini 风格的编码需要额外的布尔标志(“设置这个标志以退出循环”),这是笨拙的编码明智和低效的(你不希望在你的内循环)。使用 if-then-else、各种循环(while、for)和 break-to-labelled 块,您可以编写任何算法而不会降低效率。为什么人们不阅读文献,而不是复制 C 所做的?嗯。

于 2009-07-03T09:07:18.810 回答
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 语句。

于 2008-08-21T06:11:30.483 回答
1

steveth45给出的示例中,您可以改用函数:

function findItem(...) {
  for (...) {
    for (...) {
      for (...) {
        if (x) {
          return theItem;
        }
      }
    }
  }
}

// no need for label now
theItem = findItem(a, b, c);
于 2008-08-21T07:45:22.397 回答
0

看起来它目前在 PHP 5.3 中,但尚未完全记录。据我所知,它与 C 共享它的 goto 语法,所以它应该很容易上手和使用。只要记住 Dijkstra 的警告并仅在必要时使用它。

于 2008-08-21T06:14:40.587 回答
0

@steveth45

我的经验法则是,如果您的代码嵌套深度超过 3 层,那么您就做错了。

然后你不必担心使用多个 break 语句或 goto :D

于 2008-08-21T06:16:43.297 回答
0

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

于 2013-04-24T10:55:13.210 回答