GOTO在PHP中是邪恶的吗?

我最近发现PHP 5.3支持新的语言结构叫做GOTO 。 大家都知道它做了什么。 但是,这不完全是传统的GOTO ,它只是一个跳转标签。 我很有兴趣知道这个GOTO是否是邪恶的,并暗示着糟糕的代码?

除非你用汇编程序编程,否则GOTO应该和飞机的生命背心一样对待:它们可以使用,但是如果你需要使用它,这意味着你有很大的麻烦。

我不能相信没有人发布这个:)

xkcd  - 转到

当然,PHP没有编译…也许猛禽会追逐你每访问您的网站?

糟糕的代码结构是邪恶的,不pipe你使用的控制结构如何。

我个人比较喜欢goto,它使得程序的stream程变得“控制variables”,嵌套的“if”将间接地引起代码中的同一个分支。

所以,只写两个版本(有和没有GOTO),看看哪一个更容易理解。 那么select很简单。

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

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

实际上,我通过一个箭头代码(深度嵌套的条件)的例子,并在一个版本中使用标准实践(守卫子句,分组条件,拉出function)和另一个版本中的基于goto的版本进行重构,实际上我更喜欢基于goto的重构。

我认为这是PHP手册页的最重要的部分,并在这里丢失:

不是一个完全无限制的转到 。 目标标签必须位于同一个文件和上下文中,这意味着您不能跳出某个函数或方法,也不能跳入其中 。 你也不能跳入任何forms的循环或开关结构。 你可能会跳出这些,一个常见的用途是使用goto代替多级别的rest。

恕我直言,这使得它与老基本风格gotos非常不同。

枪是邪恶的吗? 两者都可以用于善恶。 我会说没有转到写代码是比较容易的。

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

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

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

为了回答Kaitsuli的问题,我认为在编写PHP脚本时它可能是有用的工具。 另一方面,到现在为止,已经有十几年的时间没有完成这个脚本。 而且,它更多的是面向对象的function,违背了PHP的发展。

恕我直言,代码生成也不是好事,也不是坏事:好的程序仍然是好的,“恐怖程序”会更糟……唯一的问题是:“为什么在certificate之后joinGOTO 10年没有必要? ”。

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

当你有非结构化的代码从这里跳到那里,你刚才发现来自GOTO语句的邪恶。 几乎总是最好避免它。 也许每隔10万行就有一个GOTO语句简化的地方。因此,这样的代码不是邪恶的,但如果你不确定,那么你应该避免GOTO。

希望这可以帮助。

编辑:好吧,只是在这里添加我自己的意见,还有其他的说明,让你创build非结构化的代码,并认为他们应该是不被视为邪恶的。

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

其他语言如Vb.Net(也可能是其他语言)允许执行Exit For,Exit While,Break和类似这样的事情,也解构代码,我认为应该避免。

有时(我的意思是在0.01%的情况下)它是有用的,就像当你有一个很长的脚本,你想testing一些块。 但是不要把它保存在你的最终脚本中

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

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