在PHP中使用GOTO命令?

时间:2020-03-05 18:41:24  来源:igfitidea点击:

我听说有谣言说PHP正在计划引入" goto"命令。它应该在做什么?

我尝试搜索一下,但是没有发现任何描述性很强的东西。我知道这不会像"GOTO 10"这样的命令...

解决方案

回答

当然,我不是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语句。

回答

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

回答

他们没有添加真正的GOTO,而是扩展了BREAK关键字以使用静态标签。基本上,它将增强突破嵌套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

回答

@ steveth45

我的经验法则是,如果我们嵌套的代码深度超过3个级别,那么我们在做
有事吗。

然后,我们不必担心使用多个break语句或者goto:D

回答

在steveth45给出的示例中,我们可以改用函数:

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

// no need for label now
theItem = findItem(a, b, c);

回答

我总是对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)
和标记为中断的块,我们可以编码任何算法而无需
效率损失。人们为什么不阅读文学作品呢?
复制C做什么? rr