【问题标题】:real goto usage in PHPPHP中真正的goto用法
【发布时间】:2017-04-26 10:10:46
【问题描述】:

我正在为 PHP 编写某种代码分析器,并且正在寻找在框架/脚本中使用“goto”指令的真实示例。

到目前为止,我只找到了一些marginal usage in Symfony testing suite。 似乎这个语言功能在用户空间中根本没有使用?或者它存在于某个地方?

【问题讨论】:

标签: php parsing code-analysis goto


【解决方案1】:

新答案

最近,我开始在一个新雇主工作,该雇主继承了遗留的 [定制] PHP 部分 OO 和部分 MCV 框架。在某些页面上,视图执行了大量的业务逻辑而没有实际显示任何内容;每次都包含这些扁平的 PHP 文件(而不是 include_once()),所以发生的事情是该网站的许多部分都是意大利面条和肉丸类型的脚本(GOTO 应该产生的东西因此被认为是不好的做法)。

发生的情况是某些逻辑在不需要时被触发(因为它被多次包含在多个位置),并创建错误日志,因为可能需要一行或一个 IF 语句块在数百行PHP的整个文件中。

创建一个端点并添加goto END; 是一个很好的临时步骤,可以减少错误日志并在不需要时阻止那些脚本位触发。例如:

if(empty($userRequest)){
    goto END;
}
## The rest of the script from this point needs to fire until...

if(empty($_REQUEST['user_id'])){
    goto END;
}
## etc...

当然,这只是实际减少意大利面量的一个临时步骤。我还将一些必要的功能移到了实际可行的控制器类中(并在假定的视图文件进行数据建模的地方创建了模型)。

我本可以添加 IF...ELSE 语句块来获得相同的结果,但是脚本中的逻辑数量(以及嵌套的 IF 语句的数量等......)意味着实际上添加了 goto END;在进行其他重构的同时使脚本更具可读性。

最终,当我解开所有遗留的意大利面时,我将删除 GOTO 语句,并使其完全符合 MVC 和 OO。

旧答案

这里是一个使用goto的例子:

<?php
    ten:
    print "Hello ";

    goto ten;

你是对的,它几乎从不在 PHP 编程中使用,因为现代编程智慧说它会导致更难调试的“意大利面条代码”。

但是,请尽量不要在机器级语言中使用非条件循环(goto 实际上就是这样)。我记得几年前在 MIP 汇编中使用了非条件循环。

【讨论】:

  • 我需要的是在框架/脚本中实际使用的真实示例,而不是手动/rfc/测试示例
  • 在非 OO 脚本中,如果函数不需要参数并且不希望返回值,则可以简单地将 function name() 替换为 name:。这和我能想到的一样真实。显然,你必须break; 或其他东西,否则你的脚本的一部分将继续到下一部分。
  • 我将把我的一些 PHP 脚本转换为使用 GOTO,然后我会告诉你我的进展情况。
  • @ts。 - 我在我的 PHP 框架中使用了 goto 命令,例如,这里:github.com/sbebbers/FrameWork.php/blob/master/application/… - 当然,可能有更好的方法来实现我在控制器中所做的事情,但我认为我会试一试。
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多