PHP中的GOTO是邪恶的吗?

Tow*_*wer 70 php goto

我最近发现PHP 5.3支持新的语言结构调用GOTO.每个人都知道它的作用.然而,它并不完全是传统的GOTO,它只是一个跳跃标签.我很有兴趣知道这GOTO是不是邪恶并暗示代码不好?

Kon*_*man 143

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

  • 我宁愿说"如果你需要使用它们而且你没有*它们,你就会遇到大麻烦".这是支持编程语言的强项. (64认同)
  • @ Remo.D是的,因为救生衣在飞机失事中挽救了这么多人的生命! (20认同)
  • @ButtleButkus不在飞机上*坠毁*但他们在水上(海洋,湖泊,河流)紧急着陆*中挽救了许多生命. (13认同)
  • 实际上,我确实有一个场景,goto字面上救了我们.我们开始使用MVC,我们使用MVC进行依赖关系管理,因为它有一个非常成熟的类加载系统.好吧,突然之间,在使用传统header()的遗留文件中; 死; 构造,APC开始随机抛出分段错误.Goto成为了保持遗留代码浮动的生命背心,直到它可以全部重构为控制器.它还通过避免压倒性的深度条件提供了改进的性能 (3认同)

Lor*_*ris 103

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

xkcd  - 转到

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

  • 最有趣的是他的漫画是关于goto的php手册参考:http://es.php.net/manual/en/control-structures.goto.php所以是的,猛禽会追逐你,即使是在PHP中; )也很棒的替代文字:"Neal Stephenson认为将他的标签命名为"dengo"很可爱 (20认同)
  • 如果可以,我会给你+2(一个是正确的,一个是漫画) (2认同)

Rem*_*o.D 79

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

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

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

  • 前两段+1.为什么这不是接受的答案呢?:-) (6认同)
  • 好吧...这是合理的,但我们都知道,从头至尾,我们进入此页面是因为我们对使用`goto x;`感到内。这绝不是一个人理想的工作流程,只是生活支持,我们知道我们永远也不会重写,相反,我们可悲地会留给下一个可怜的家伙处理。 (2认同)
  • +1我用它来跳转到内联代码的末尾,以避免丑陋的嵌套if().它还可以避免不必要的代码执行 - 例如你在if-elseif-elseif-else块之前执行的代码,它可以在第二个elseif之后"拯救". (2认同)

sch*_*unk 23

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

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

恕我直言,这使得它与ye olde BASIC风格的getos非常不同.


小智 18

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

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

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


Dav*_*ers 10

枪是邪恶的吗?两者都可以用于善或恶.我会说没有goto就可以更容易地编写好的代码.

  • 枪不杀人.魔法导弹呢. (22认同)
  • @antoineMoPa因此,请不要在加拿大使用goto。 (3认同)
  • 在加拿大,我们拥有更少的枪支和更少的枪支暴力。因此,我建议不要使用 goto 语句。 (2认同)

Mar*_*dle 7

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


Arn*_*rno 5

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

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

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

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