【发布时间】:2010-09-06 08:54:47
【问题描述】:
我听说 PHP 计划引入“goto”命令。它应该做什么?
我尝试了一些搜索,但没有找到任何非常具有描述性的内容。我知道它不会是类似“GOTO 10”的命令...
【问题讨论】:
-
事实上它是在 PHP5 中的。它的作用是“只是简单地转到”。
标签: php language-features goto
我听说 PHP 计划引入“goto”命令。它应该做什么?
我尝试了一些搜索,但没有找到任何非常具有描述性的内容。我知道它不会是类似“GOTO 10”的命令...
【问题讨论】:
标签: php language-features goto
当然,我不是 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,而是扩展 BREAK 关键字以使用静态标签。基本上,它将增强打破 switch 嵌套 if 语句的能力。这是我找到的概念示例:
<?php
for ($i = 0; $i < 9; $i++) {
if (true) {
break blah;
}
echo "not shown";
blah:
echo "iteration $i\n";
}
?>
当然,一旦GOTO“谣言”一出,就没有什么可以阻止一些邪恶的家伙传播一个额外的COMEFROM笑话了。保持警惕。
另见:
【讨论】:
@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做了什么?咕噜。
【讨论】:
php 中有一个goto -> http://php.net/manual/en/control-structures.goto.php,但我不会用它,只写普通代码...
【讨论】: