当前位置:首页> 正文

关于语言功能:PHP中的GOTO命令?

关于语言功能:PHP中的GOTO命令?

GOTO command in PHP?

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

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


他们没有添加真正的GOTO,而是扩展了BREAK关键字以使用静态标签。基本上,它将增强突破嵌套if语句的 switch 的能力。这是我发现的概念示例:

1
2
3
4
5
6
7
8
9
10
11
<?php
for ($i = 0; $i < 9; $i++) {
    if (true) {
        break blah;
    }
    echo"not shown";
    blah:
    echo"iteration $i\
"
;
}
?>

当然,一旦GOTO的"谣言"出炉了,就没有什么可以阻止一些邪恶的人传播另外的COMEFROM笑话了。保持警惕。

也可以看看:

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


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

1
2
3
4
5
6
7
8
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


当然,我不是PHP程序员,并且我不知道PHP对GOTO的确切实现将是什么样子,但这是我对GOTO的理解:

GOTO就像其他任何一样,都是更明确的流程控制语句。假设您有一些嵌套循环,而您只需要查找一件事。您可以放入一个或多个条件语句,并在适当满足条件时使用GOTO语句退出所有循环(而不是在嵌套的每个级别都使用条件语句使用" break"语句是的,我相信传统的实现方式是具有命名标签,GOTO语句可以按名称跳转到该标签。您可以执行以下操作:

1
2
3
4
5
6
7
8
9
for(...) {
    for (...) {
        for (...) {
        // some code
        if (x) GOTO outside;
        }
    }
}
:outside

与没有GOTO语句相比,这是一种更简单(更有效)的实现。等效为:

1
2
3
4
5
6
7
8
9
10
for(...) {
    for (...) {
        for (...) {
            // some code
            if (x) break;
        }
        if(x) break;
    }
    if(x) break;
}

在第二种情况下(这是惯例),有三个条件语句,这显然比仅具有一个条件语句要慢。因此,出于优化/简化的原因,您可能希望在紧密嵌套的循环中使用GOTO语句。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function findItem(...) {
  for (...) {
    for (...) {
      for (...) {
        if (x) {
          return theItem;
        }
      }
    }
  }
}

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

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


@ steveth45

我的经验法则是,如果嵌套的代码深度超过3个级别,则说明
有问题。

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


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


展开全文阅读

相关内容