相关疑难解决方法(0)

PHP和goto语句将在PHP 5.3中添加

"goto"语句直接来自ASM或任何其他汇编语言.

这是一个链接:http://be2.php.net/manual/en/control-structures.goto.php

我想知道:这可以做些什么来使我的代码组织得更好?如何在大型项目中实现这一点,而不是搞砸它.由于goto允许你来回跳转,如果以错误的方式使用它,意外分配和无限循环等待发生.

有人能给我一个好用的例子吗?

编辑:好吧,我已经看到了一些回复,显然对使用"goto"语句存在广泛的共识而且它很糟糕.

所以我还在想:为什么PHP会把它添加到语言中呢.如果他们没有看到内容,他们就不会这样做......为什么呢?

另外:关于"goto"的StackOverflow讨论一般

EDIT2:看到这个问题引发了许多令人难过的goto声明,我去问我的父亲.他今年52岁,是一名工业工程师.
他曾多次告诉我他在他的日子里做了大量的编程,主要是在FORTRAN和COBOL.如今,他从事IT服务,服务器和网络管理等工作.

无论如何,他说了一些关于"回到我的日子......"的事情.
经过讨论后,他回到了goto声明,说即使在他作为学生的日子里,他们都知道这不是一个聪明的人想要使用它,但当时它们并没有好多少.尝试/捕获仍然是几年之后,错误处理几乎没有.
那么你做了什么检查你的程序?在最后添加几行,允许您打印输出以及检查代码所需的所有内容,然后放置行:"goto printing;"或类似内容,以开始打印数据.

通过这种方式,您逐步调试了代​​码.

他同意在现代编程世界中使用goto是没有用的.他认为合理的唯一用途是"紧急休息",用于极端调试和意外情况.有点像goto fatal_error;,并且代码的"fatal_error"部分会做一些事情来向您展示深入的结果.
但只是在创造某些东西的时候.成品不应该有goto语句.

LATE EDIT:关于PHP5.3/PHP6中"goto"的另一个讨论

php goto

18
推荐指数
2
解决办法
2万
查看次数

PHP中goto的有效用例是什么?

我知道,还有其他 关于PHP 5.3中引入的语句的问题goto.

但我找不到任何体面的答案,都是"最后的手段","xkcd","邪恶","坏","邪恶!!!".但没有有效的例子.只有没有任何用途的陈述.或者说有一些罕见的用例(再次,没有例子).

所以,问题是:" gotoPHP 中的有效用例是什么?"."是goto邪恶的?"的答案 不受欢迎,将被投票.谢谢 :)

或者有人链接到RFC,其中解释了决定 - 我找不到一个.

php goto

14
推荐指数
2
解决办法
1918
查看次数

GOTO和THROW之间的区别?

最近有很多人指责我只提一个字 - "goto".
这让我很奇怪,为什么它被认为是一个令人讨厌的词.
我知道之前有几个关于这个主题的讨论,但它并没有让我信服 - 答案只是说"它很糟糕"甚至没有尝试解释,有些带来理由,与PHP,IMO等脚本语言无关.

无论如何,我将问一个非常特别的问题:
让我们进行比较gotothrow陈述.
在我看来,两者都做同样的事情:避免基于某些条件执行某些代码.
如果是这样 - 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)

php exception-handling goto try-catch

7
推荐指数
5
解决办法
1732
查看次数

php:在catch()中重复函数调用2-3次

所以一个函数有时崩溃(未被捕获的异常),我想重新调用它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)

php repeat uncaught-exception

2
推荐指数
1
解决办法
3879
查看次数

如何在不使用GoTo的情况下进行编程

我知道goto语句是不好的,但是我发现很难在编程时不使用它们。我是一名新程序员,我知道它们是不好的做法,但是有什么方法可以解决这些问题呢?我知道IF ELSE语句,但是还有哪些其他工具可以帮助我避免使用GoTo?

php goto

-1
推荐指数
1
解决办法
105
查看次数

PHP中的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)

php goto

-3
推荐指数
1
解决办法
521
查看次数