在PHP中使用GOTO命令?
我听说有谣言说PHP正在计划引入" goto"命令。它应该在做什么?
我尝试搜索一下,但是没有发现任何描述性很强的东西。我知道这不会像"GOTO 10
"这样的命令...
解决方案
回答
当然,我不是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语句。
回答
看起来它当前在PHP 5.3中,但是尚未完全记录。据我所知,它与C共享其goto语法,因此应该很容易拿起和使用。只要记住Dijkstra的警告并仅在必要时使用它即可。
回答
他们没有添加真正的GOTO,而是扩展了BREAK关键字以使用静态标签。基本上,它将增强突破嵌套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
回答
@ 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做什么? rr