【问题标题】:GOTO command in PHP?PHP中的GOTO命令?
【发布时间】:2010-09-06 08:54:47
【问题描述】:

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

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

【问题讨论】:

  • 事实上它是在 PHP5 中的。它的作用是“只是简单地转到”。

标签: php language-features goto


【解决方案1】:

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

【讨论】:

  • 出于这个原因,您不需要 GOTO。请参阅我的答案,了解一种更结构化的方式来表达打破总是有效并引入零低效率的循环。为此目的转到Goto只是愚蠢的。 (不是对你的反映。)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    他们没有添加真正的 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

    【讨论】:

    • 我认为这确实令人困惑,因为 break 本身会跳出 for 循环,而不仅仅是 if 语句。
    【解决方案4】:

    @steveth45

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

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

    【讨论】:

    • 我有点同意,但有时多层嵌套循环不可避免,不应该被嘲笑。
    【解决方案5】:

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

    function findItem(...) {
      for (...) {
        for (...) {
          for (...) {
            if (x) {
              return theItem;
            }
          }
        }
      }
    }
    
    // no need for label now
    theItem = findItem(a, b, c);
    

    【讨论】:

      【解决方案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) 和中断标记块,您可以编写任何算法而无需 效率损失。为什么人们不阅读文学作品,而是 复制C做了什么?咕噜。

      【讨论】:

      • 这不是你提到的 break-to-labelled-block 的东西,这个 PHP 新功能正在提出什么吗?如果我错了,请原谅我
      • 哪个新功能?去? GOTO 会将您带到放置在代码的某个随机部分中的标签。 break-to-label only 允许从块内部中断到块出口。
      • 嗯,我猜你提到的break-to-label 就是正是 传闻将在php6 中引入的东西。它不是在恢复 GOTO。
      • @Felipe:这个线程是关于 GOTO 是“新的”。它已经在 PHP5 中,它的工作方式类似于... GOTO,这是我的抱怨。 PHP6 可能会引入其他东西,甚至可能是智能设计的突破,但这不是这里的主题。
      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-08
        • 1970-01-01
        • 1970-01-01
        • 2018-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多