PHP中的GOTO是邪恶的吗?

时间:2009-12-14 10:04:53

标签: php goto

我最近发现PHP 5.3支持名为GOTO的新语言结构。每个人都知道它的作用。但是,它不完全是传统的GOTO,它只是一个跳转标签。我很有兴趣知道这个GOTO是否是邪恶的并且意味着代码不好?

12 个答案:

答案 0 :(得分:140)

除非您使用汇编程序进行编程,否则GOTO应始终采用与飞机救生衣相同的方式处理:提供它们是件好事,但如果您需要使用它们,则意味着您遇到了大麻烦。

答案 1 :(得分:102)

我简直不敢相信这个:)

xkcd - goto

当然,PHP没有编译......也许猛禽会在每次访问你的网站时追逐你?

答案 2 :(得分:78)

无论您使用何种控制结构,错误的代码结构都是邪恶的。

我个人更喜欢使用goto来清除程序流程“控制变量”和嵌套“if”,这将间接地导致代码中的相同分支。

所以,只需编写两个版本(有和没有GOTO),看看哪一个更容易理解。然后选择很容易。

答案 3 :(得分:21)

我认为这是PHP manual page中最重要的部分,但在此处缺失:

  

不是完全不受限制的转到。目标标签必须位于同一文件和上下文中,这意味着您不能跳出函数或方法,也不能跳到一个。您也无法跳转到任何类型的循环或切换结构。你可以跳出这些,常用的是用goto代替多级休息。

恕我直言,这与 ye olde BASIC style gotos 非常不同。

答案 4 :(得分:18)

我是少数(目前),但我相信对PHP的goto构造的限制是一个非常有益的工具:

http://adamjonrichardson.com/2012/02/06/long-live-the-goto-statement/

我实际上是通过一个箭头代码示例(深度嵌套的条件)并使用标准实践(保护条款,分组条件,提取函数)在一个版本中重构它,在另一个版本中使用基于goto的版本重构它,然后我实际上更喜欢基于goto的重构。

答案 5 :(得分:10)

枪是邪恶的吗?两者都可以用于善或恶。我会说在没有goto的情况下编写好的代码比使用。

更容易

答案 6 :(得分:7)

任何可以使代码在特定情况下更具可读性的语言功能都是一件好事。 GOTO就是这样一种语言特征,即使这些情况很少也很少。如果我们禁止任何语法使得糟糕的程序员能够编写糟糕的,不可维护的代码,那么我们的工作将会变得非常困难。

答案 7 :(得分:5)

作为一名软件工程师,我主要从事“大型机”和“大型企业服务器”...... 我们的日常用语(我的意思是95%的基本代码中的一个)是Cobol,它广泛使用GOTO。

这种用法并不意味着代码很糟糕。这只是意味着这个工具(GOTO)在编写程序时是正确的。

要回答Kaitsuli的问题,我认为它在编写PHP脚本时可能是有用的工具。 另一方面,到目前为止,已经有很多脚本在没有它的情况下实现了近十年。此外,它反对PHP的演变,具有更多面向对象的功能。

恕我直言,对于代码的制作既不好也不坏:好的程序仍然会很好,“恐怖程序”会更糟......唯一的问题是:“为什么在证明它之后10年内添加GOTO没有必要吗?“。

答案 8 :(得分:4)

GOTO通常是邪恶的,因为它可以让你构建非结构化代码。通过常规循环,您可以构建易于遵循的良好结构化代码,因为它是结构化的。

当你有非结构化代码从这里跳到那里时,你刚刚发现了来自GOTO声明的邪恶。几乎总是更好地避免它。也许每隔100.000行有一个GOTO句子简化的地方A LOT代码因此不是邪恶但如果你不确定,那么你应该避免使用GOTO。

希望这有帮助。

编辑:嗯,只是为了在这里添加我自己的观点,还有其他指令允许您创建非结构化代码,并且当我认为它们应该被认为是邪恶时。

例如,函数中间的返回是一个GOTO到它的结尾,所以我避免使用它们,并且在每个函数的最后只使用一个返回。

其他语言,如Vb.Net(也许还有其他语言)允许执行Exit For,Exit While,break以及类似的事情,这些也会使代码结构化,我认为应该避免使用。

答案 9 :(得分:2)

有时(我的意思是在0.01%的情况下)它很有用,就像你有一个很长的脚本而你想要测试一些块。但永远不要把它放在最后的剧本中

答案 10 :(得分:1)

当我编写用于在cli模式下工作的脚本时,我使用了GOTO。它拯救了我的生命。

答案 11 :(得分:-12)

应该从语言中删除GOTO。如果有人需要“无条件转移控制”,那么他们需要回到学校学习结构化编程101

相关问题