我听说有谣言说PHP正在计划引入" goto"命令。 它应该在做什么?
我尝试搜索一下,但是没有发现任何描述性很强的东西。 我知道这不会是类似" GOTO 10"的命令...
他们没有添加真正的GOTO,而是扩展了BREAK关键字以使用静态标签。基本上,它将增强突破嵌套if语句的 switch s>的能力。这是我发现的概念示例:
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的警告并仅在必要时使用它即可。