新答案
最近,我开始在一个新雇主工作,该雇主继承了遗留的 [定制] 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 汇编中使用了非条件循环。