PHP中goto的有效用例是什么?

时间:2011-01-30 15:00:52

标签: php goto

我知道,关于PHP 5.3中引入的goto语句,有other questions

但我在那里找不到任何体面的答案,所有都是“最后的手段”,“xkcd”,“邪恶”,“坏”,“邪恶!!!” 。但没有有效的例子。只有没有任何用途的陈述。或者说有一些罕见的用例(再次,没有例子)。

所以,问题是:“PHP中goto的有效用例是什么?”。 “是goto邪恶?”的答案不受欢迎,将被投票。谢谢:))

或者某人有链接到解释决定的RFC - 我找不到。

5 个答案:

答案 0 :(得分:6)

一种可能的用途(可以使用其他方式实现)是finite state machine的实现。

答案 1 :(得分:5)

请参阅PHP Architect - GOTO in PHP 5.3: is it Really That Evil?

本文简要概述了为什么GOTO有用,为什么我们在PHP中使用它(自2004年以来)以及为什么它是/有争议的。一般的答案似乎是:GOTO几乎没用,应该避免,除非在非常狭窄的应用程序空间(如构建编译器):

  

有一件事是肯定的:有一些应用程序可以让优秀的开发人员充分利用GOTO来生成更简单,更高效的代码,但它们可能不是普通开发人员将要编写的主流程序;因此,这里有一个合理的担忧,即没有经验的程序员会使用GOTO来损害他们的代码。

另请参阅文章中提到的一些原始新闻列表讨论/争议:

另请参阅有关GOTO considered harmful at C2 Wiki

的这种彻底的语言无关讨论

答案 2 :(得分:4)

我使用它的一种情况是当我进行多级检查时,当我可以在检查后跳转到相关部分时不想添加额外的代码。

例如,有一个系统可以检查仓库中各种机器的状态,并且整个仓库都会失败并在任何一个系统的任何一个部分死亡时发出警报,伪代码就像这样:

if(hsensor[status] != OK) {
    alert = Humidity sensor hsensor[fail_id] failed with error hsensor[fail_error]
    goto sendAlert;
}

if(cosensor[status] != OK) {
    alert = Co2 sensor cosensor[fail_id] failed with error cosensor[fail_error]
    goto sendAlert;
}

这样,如果任何失败,我可以跳过所有其他检查并直接进入警报状态。随叫随到的人接收警报并提取任何称为警报的功能的全部结果,以便他们可以修复它。

答案 3 :(得分:2)

goto运算符可用于打破多级循环。

这个特定的goto应用示例是at goto manual page

  

您也无法跳转到任何类型的循环或切换结构。你可以跳出这些,常用的是用goto代替多级休息。

答案 4 :(得分:2)

Goto已大量取代continuebreaktry...catch等专业语句。在我使用PHP的那些年里,我觉得它不能帮助我一次。在像C ++这样没有break x语句的语言中,它可以用来跳出嵌套循环,但由于PHP有它,所以没有理由。

Code Complete有关于gotos的非常好的和详细的章节。引用最后两段:

  

使用gotos是一个宗教问题。我的教条是,在现代语言中,您可以使用等效的顺序构造轻松替换十分之九。在这些简单的情况下,你应该用习惯取代gotos。在困难的情况下,您仍然可以在十分之九的情况下驱除goto:您可以将代码分解为更小的例程,使用try-finally,使用嵌套ifs,测试和重新测试状态变量,或重构条件。在这些情况下,消除goto更难,但这是一个很好的心理练习,本节中讨论的技术为你提供了工具。

     

在剩余的100个案例中,goto是问题的合法解决方案,请将其清楚地记录下来并使用它。如果你穿上雨靴,不值得在街区走动以避免泥水坑。但请保持对其他程序员建议的无人值守方法持开放态度。他们可能会看到你没有的东西。

我发现很难理解为什么PHP团队根本无法添加它(毕竟那些年我们没有它就生活在和平之中)。