PHP中真正的goto用法

时间:2017-04-26 10:10:47

标签: php parsing code-analysis goto

我正在为PHP编写某种代码分析器,我正在寻找使用" goto"的现实例子。框架/脚本中的指令。

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

1 个答案:

答案 0 :(得分:0)

新答案

最近,我开始在一家新雇主工作,该雇主继承了遗留的[定制] 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编程中使用过,因为现代编程智慧说它会导致&#34;意大利面条代码&#34;这更难调试。

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