我正在为PHP编写某种代码分析器,我正在寻找使用" goto"的现实例子。框架/脚本中的指令。
到目前为止,我发现只有一些marginal usage in Symfony testing suite。 似乎这个语言功能在用户区根本没用过?或者它存在于某个地方?
答案 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汇编的非条件循环。