GOTO在PHP中是邪恶的吗?

GOTO在PHP中是邪恶的吗?,php,goto,Php,Goto,我最近发现PHP5.3支持名为GOTO的新语言结构。每个人都知道它的作用。然而,它并不完全是传统的转到,它只是一个跳转标签。我很想知道这个GOTO是否邪恶,是否意味着坏代码?枪是邪恶的吗?两者都可以用于善或恶。我想说,不使用goto编写好的代码比使用goto编写好的代码要容易。无论使用何种控制结构,糟糕的代码结构都是有害的 我个人更喜欢goto,它将程序流清楚地表示为“控制变量”,并嵌套“if”,这将间接导致代码中的同一分支 所以,只需写两个版本(有和没有GOTO),看看哪一个更容易理解。那么选

我最近发现PHP5.3支持名为
GOTO
的新语言结构。每个人都知道它的作用。然而,它并不完全是传统的转到,它只是一个跳转标签。我很想知道这个
GOTO
是否邪恶,是否意味着坏代码?

枪是邪恶的吗?两者都可以用于善或恶。我想说,不使用goto编写好的代码比使用goto编写好的代码要容易。

无论使用何种控制结构,糟糕的代码结构都是有害的

我个人更喜欢goto,它将程序流清楚地表示为“控制变量”,并嵌套“if”,这将间接导致代码中的同一分支


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

GOTO通常是邪恶的,因为它允许您构建非结构化代码。使用通常的循环,您可以构建良好的结构化代码,因为它是结构化的,所以易于遵循

当非结构化代码从这里跳到那里时,您刚刚发现GOTO语句中的邪恶。几乎总是最好避免它。也许每100.000行就有一个地方,一个GOTO语句可以简化很多代码,因此代码不是邪恶的,但是如果你不确定,那么你应该避免GOTO

希望这有帮助

编辑:好吧,我想在这里补充一下我自己的观点,还有其他一些指令允许您创建非结构化代码,并且在我认为它们应该是邪恶的时候,它们并不被认为是邪恶的

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


其他语言,如Vb.Net(可能也有其他语言)允许执行Exit For、Exit While、break和类似的操作,这些操作也会对代码进行非结构化处理,我认为应该避免这些操作。

除非您使用汇编语言编程,否则GOTO应该始终被视为飞机的救生衣:有它们是很好的,但是如果你需要使用它们,那就意味着你有大麻烦了。

任何语言特性都可以使代码在特定情况下更具可读性,这是一件好事。GOTO就是这样一种语言特性,即使这种情况很少。如果我们禁止任何语法,使贫穷的程序员有可能编写糟糕的、无法维护的代码,我们的工作就会困难得多。

我不敢相信没有人发布这条消息:)


当然,PHP不是编译的。。。也许猛禽每次访问你的网站都会追你?

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

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

为了回答Kaitsuli的问题,我认为它在编写PHP脚本时是一个有用的工具。 另一方面,到目前为止,许多脚本在将近十年的时间里都没有它。此外,它与PHP的发展背道而驰,具有更多面向对象的特性

嗯,这对代码的产生既不是好事也不是坏事:好的程序仍然是好的,“恐怖程序”会更糟。。。唯一的问题是:“为什么要在证明没有必要的10年后添加goto?”。

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


实际上,我浏览了一个arrow代码示例(深度嵌套的条件),并在一个版本中使用标准实践(保护子句、分组条件、拉出函数)对其进行重构,在另一个版本中使用基于goto的版本,实际上,我更喜欢基于goto的重构。

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

我认为这是最重要的一部分,这里缺少了:

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


这使得它与以前的基本风格gotos非常不同。

有时(我的意思是在0.01%的情况下)它很有用,比如当你有一个很长的脚本,你想测试一些块。但千万不要把它写在你的最后剧本中

枪不会杀人。魔法导弹可以。在加拿大,我们的枪支和暴力更少。因此,我建议不要使用goto语句。@antoineMoPa所以,不要在加拿大使用goto。显然,goto是有道德的。我们只需要经过goto安全系统的持照人员course@antoineMoPa冒着被禁止这样做的风险,这一评论就像是说刚果共和国因汽车导致的死亡人数减少了,因为他们的汽车数量减少了。汽车,以及goto语句,在某些情况下有着被证明的实用性。所以我们可能需要一个“Goto许可证”?Goto就像用于HTML解析的regexp;在大学里,当我想激怒我的教授时,我总是使用goto语句,muahahahahahaha……这些程序当然仍然可以完美地运行,但当他们遇到这些小语句时,我总能看到他们的眼睛抽搐>“然而,这不完全是传统的
goto
,它只是一个跳跃标签。”这与“传统的”转到有何不同?反复出现的关于StackOverflow的问题被认为是有害的。转到一点也不邪恶。。但这确实是邪恶的:
eval(“foo:goto foo;”)我害怕使用goto,因为任何阅读我代码的人都可能对我失去信心,因为我已经有近20年没有使用goto了(除了在汇编中)。甚至当我