我听说 PHP 计划引入“goto”命令的传言。它应该做什么?
我尝试搜索了一下,但没有找到任何非常具有描述性的内容。我知道这不会是一个类似“ GOTO 10
”的命令......
我听说 PHP 计划引入“goto”命令的传言。它应该做什么?
我尝试搜索了一下,但没有找到任何非常具有描述性的内容。我知道这不会是一个类似“ GOTO 10
”的命令......
他们没有添加真正的 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笑话。保持警惕。
也可以看看:
我总是对 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 所做的?嗯。
诚然,我不是 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 语句。
在steveth45给出的示例中,您可以改用函数:
function findItem(...) {
for (...) {
for (...) {
for (...) {
if (x) {
return theItem;
}
}
}
}
}
// no need for label now
theItem = findItem(a, b, c);
@steveth45
我的经验法则是,如果您的代码嵌套深度超过 3 层,那么您就做错了。
然后你不必担心使用多个 break 语句或 goto :D
goto
在 php -> http://php.net/manual/en/control-structures.goto.php中有一个,但我不会使用它,只需编写普通代码...