我最近发现PHP 5.3支持名为的新语言构造GOTO
。每个人都知道它在做什么。但是,它不完全是传统的GOTO
,只是一个跳转标签。我很想知道这GOTO
是否有害并暗示错误代码?
GOTO
,只是一个跳转标签。” 这与“传统”GOTO
有何不同?
GOTO
StackOverflow上的问题被认为是有害的。
eval("foo: goto foo;");
我最近发现PHP 5.3支持名为的新语言构造GOTO
。每个人都知道它在做什么。但是,它不完全是传统的GOTO
,只是一个跳转标签。我很想知道这GOTO
是否有害并暗示错误代码?
GOTO
,只是一个跳转标签。” 这与“传统”GOTO
有何不同?
GOTO
StackOverflow上的问题被认为是有害的。
eval("foo: goto foo;");
Answers:
除非您使用汇编程序进行编程,否则应始终将GOTO与飞机的救生背心以相同的方式对待:可以使用它们是一件好事,但是如果您需要使用它们,则意味着您会遇到很大的麻烦。
无论使用哪种控制结构,不良的代码结构都是有害的。
我个人更喜欢goto,它使程序的流程更清楚地显示为“控制变量”,并嵌套了“ if”,这将间接导致代码中的同一分支。
因此,只需编写两个版本(带有和不带有GOTO),然后看看哪个版本更容易理解。那么选择就很容易。
goto x;
。这绝不是一个人理想的工作流程,只是生活支持,我们知道我们永远也不会重写,相反,我们可悲地会留给下一个可怜的家伙处理。
我认为这是PHP手册页中最重要的部分,在这里缺少:
这不是完全不受限制的goto。目标标签必须在同一文件和上下文中,这意味着您不能跳出一个函数或方法,也不能跳入一个。您也不能跳入任何形式的循环或开关结构。您可能会跳过这些,通常的用法是使用goto代替多级中断。
恕我直言,这使其与以往的BASIC风格完全不同。
goto
在PHP BTW github.com/schmunk42/retry/blob/master/src/retry.php -学分去igorw
... use a goto in place of a multi-level break.
考虑到PHP实际上有一个多级中断,这是一个有趣的陈述。break 2;
例如将打破两个循环。只是把这个留在这里给任何人。您可能需要多层次的休息。
我目前只是少数派,但我相信对PHP的goto构造施加的限制使之成为一个非常有益的工具:
http://adamjonrichardson.com/2012/02/06/long-live-the-goto-statement/
我实际上浏览了一个箭头代码示例(深层嵌套的条件),并在一个版本中使用标准实践(保护子句,分组条件,提取函数)对其进行了重构,而在另一版本中使用了基于goto的版本进行重构,实际上,我更喜欢使用基于goto的重构。
枪是邪恶的吗?两者都可以用于善恶。我想说,没有goto编写好的代码要比使用goto编写容易。
在给定情况下可以使代码更具可读性的任何语言功能都是一件好事。即使这些情况很少且相差甚远,GOTO也是其中一种语言功能。如果我们禁止任何语法使贫穷的程序员能够编写糟糕的,无法维护的代码,那么我们的工作将变得非常困难。
作为一名软件工程师,我主要从事“大型机”和“大型公司服务器”的工作...而我们的日常语言(我的意思是基本代码中95%的一种)是Cobol,它广泛使用GOTO。
这种用法并不意味着代码是错误的。这只是意味着在编写程序时,此工具(GOTO)是正确的工具。
为了回答Kaitsuli的问题,我认为它在编写PHP脚本时可能是有用的工具。另一方面,到现在为止,已经有近十年的时间,很多脚本没有使用它。此外,它还具有更多面向对象的功能,与PHP的发展背道而驰。
恕我直言,代码的生产既不是好事也不是坏事:好的程序仍然会是好的,而“恐怖程序”会变得更糟……唯一的问题是:“为什么在证明没有必要10年后添加GOTO呢? ”。
GOTO通常是邪恶的,因为它使您可以构建非结构化代码。通过通常的循环,您可以构建易于遵循的良好结构化代码,因为它是结构化的。
当您有非结构化代码从此处跳到那里时,您刚刚发现邪恶来自GOTO语句。几乎总是最好避免这种情况。也许每100.000行中有一个GOTO语句可以简化很多代码的地方,因此代码并不有害,但是如果不确定,则应避免使用GOTO。
希望这可以帮助。
编辑:好吧,只是在这里添加我自己的意见,还有其他一些指令可以让您创建非结构化代码,并且在我认为应该使用时不认为是有害的。
例如,函数中间的返回是转到该函数结尾的位置,因此我避免使用它们,并且在每个函数的末尾仅使用一个返回。
像Vb.Net这样的其他语言(也许还有其他语言)也可以执行Exit For,Exit While,breaks和类似的事情,这些事情也会使代码的结构变得混乱,我认为应该避免。
编写用于在cli模式下工作的脚本时,我使用了GOTO。它救了我的命。
while(true)
它进行编写,因此它可以永远执行下去,直到您将其杀死为止,但这只是肮脏的方式。
while()
。如果您不使用GOTO,那并不意味着它应该从语言中删除。