"goto"语句直接来自ASM或任何其他汇编语言.
这是一个链接:http://be2.php.net/manual/en/control-structures.goto.php
我想知道:这可以做些什么来使我的代码组织得更好?如何在大型项目中实现这一点,而不是搞砸它.由于goto允许你来回跳转,如果以错误的方式使用它,意外分配和无限循环等待发生.
有人能给我一个好用的例子吗?
编辑:好吧,我已经看到了一些回复,显然对使用"goto"语句存在广泛的共识而且它很糟糕.
所以我还在想:为什么PHP会把它添加到语言中呢.如果他们没有看到内容,他们就不会这样做......为什么呢?
EDIT2:看到这个问题引发了许多令人难过的goto声明,我去问我的父亲.他今年52岁,是一名工业工程师.
他曾多次告诉我他在他的日子里做了大量的编程,主要是在FORTRAN和COBOL.如今,他从事IT服务,服务器和网络管理等工作.
无论如何,他说了一些关于"回到我的日子......"的事情.
经过讨论后,他回到了goto声明,说即使在他作为学生的日子里,他们都知道这不是一个聪明的人想要使用它,但当时它们并没有好多少.尝试/捕获仍然是几年之后,错误处理几乎没有.
那么你做了什么检查你的程序?在最后添加几行,允许您打印输出以及检查代码所需的所有内容,然后放置行:"goto printing;"或类似内容,以开始打印数据.
通过这种方式,您逐步调试了代码.
他同意在现代编程世界中使用goto是没有用的.他认为合理的唯一用途是"紧急休息",用于极端调试和意外情况.有点像goto fatal_error;
,并且代码的"fatal_error"部分会做一些事情来向您展示深入的结果.
但只是在创造某些东西的时候.成品不应该有goto语句.
LATE EDIT:关于PHP5.3/PHP6中"goto"的另一个讨论
最近有很多人指责我只提一个字 - "goto".
这让我很奇怪,为什么它被认为是一个令人讨厌的词.
我知道之前有几个关于这个主题的讨论,但它并没有让我信服 - 答案只是说"它很糟糕"甚至没有尝试解释,有些带来理由,与PHP,IMO等脚本语言无关.
无论如何,我将问一个非常特别的问题:
让我们进行比较goto
和throw
陈述.
在我看来,两者都做同样的事情:避免基于某些条件执行某些代码.
如果是这样 - throw
与goto有同样的缺点吗?(如果有的话)?
如果不是 - 那就是惠特.
任何经验丰富的人,谁能说出以下两个代码片段的代码结构之间的基本概念差异?
关于这些非常的代码片段,不是"在理论上"或"一般"或"这里是一个不错的XKCD漫画!".
为什么第一个被认为是辉煌的而后一个被认为是最致命的罪?
#$a=1;
#$b=2;
/* SNIPPET #1 */
try {
if (!isset($a)) {
throw new Exception('$a is not set');
}
if (!isset($b)) {
throw new Exception('$b is not set');
}
echo '$a + $b = '.($a + $b)."<br>\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "<br>\n";
}
/* SNIPPET #2 …
Run Code Online (Sandbox Code Playgroud) 所以一个函数有时崩溃(未被捕获的异常),我想重新调用它2次,当发生延迟1秒时,让我们说.这是代码,但它似乎不起作用:
$crashesn = 0;
function checkNum($number) {
echo $number . "<br>";
if ($number>1) {
throw new Exception("Value must be 1 or below");
}
return true;
}
try {
checkNum(2);
echo 'If you see this, the number is 1 or below';
}
catch(Exception $e) {
$crashesn++;
echo "crashes number:".$crashesn."<br>";
if ($crashesn <= 2) {
sleep(1);
checkNum(2);
} else {
echo "MESSAGE: " .$e->getMessage();
}
}
Run Code Online (Sandbox Code Playgroud)
checknum是抛出异常的函数(这里每次抛出异常都会崩溃).问题是,当我运行这段代码时,我仍然在我的页面上出现错误消息
Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in G:\fix\ta_dll\test.php:30 …
Run Code Online (Sandbox Code Playgroud) 我知道goto语句是不好的,但是我发现很难在编程时不使用它们。我是一名新程序员,我知道它们是不好的做法,但是有什么方法可以解决这些问题呢?我知道IF ELSE语句,但是还有哪些其他工具可以帮助我避免使用GoTo?
我在PHP中使用带有goto函数的代码片段
这是我的代码
function goto_test()
{
$a = 3;
if($a == 3)
{
goto x;
}
else
{
if($a == 2)
echo "Thuthmekri";
else if($a==1)
goto y;
}
echo "Thothamon";
x:
{
echo "There was a brown crow";
}
y:
{
echo "There was a white crow";
}
}
Run Code Online (Sandbox Code Playgroud)
问题是它正在显示
There was a brown crowThere was a white crow
Run Code Online (Sandbox Code Playgroud)
现在它似乎正在goto x;
运行到goto
标签x;
并运行它.
但为什么标签y
也会被执行?它不应该遗留下来$a=3
吗?
编辑:
注意 - 人们问我,为什么我会使用Goto.我粘贴的代码只是为了让你理解我面临的一个场景.我的实际情况代码是一个巨大的代码.在这种情况下,我似乎需要使用goto.
如果我把我原来的代码放在这里,可能就是这样.然后人们会了解情况.可能会看到实际位置,人们会停止低估我
if($this->session->userdata('discount_on')==true && $this->session->userdata('discount_on')==2)
{ …
Run Code Online (Sandbox Code Playgroud)