相关疑难解决方法(0)

PHP中的GOTO是邪恶的吗?

我最近发现PHP 5.3支持新的语言结构调用GOTO.每个人都知道它的作用.然而,它并不完全是传统的GOTO,它只是一个跳跃标签.我很有兴趣知道这GOTO是不是邪恶并暗示代码不好?

php goto

70
推荐指数
8
解决办法
4万
查看次数

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万
查看次数

使用匿名函数递归

可能重复:
javascript:递归匿名函数?
匿名递归PHP函数

我在想......是否可以使用匿名函数进行递归?

这是一个例子:我需要得到六个字符长的字符串,它可能只包含数字和空格.唯一的规则是它不能以空格开头或结尾.我们检查一下,如果发生这种情况 - 只需在相同的匿名函数上调用递归.怎么样!?

function() {

    $chars   = range(0, 9);
    $chars[] = ' ';
    length   = 6;
    $count   = count($chars);

    $string = '';
    for ($i = 0; $i < $length; ++$i) {

        $string .= $chars[mt_rand(0, $count - 1)];

    }

    $string = trim($string);

    if (strlen($string) !== $length) { // There were spaces in front or end of the string. Shit!

        // Do recursion.

    }

    return $string;

}
Run Code Online (Sandbox Code Playgroud)

php recursion reference anonymous-function anonymous-recursion

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

PHP:使用Goto的有效理由?

我知道goto声明不赞成但我想知道以下情况是否会使它最容易被接受.

我想为列值创建一个唯一的随机数,但要做到这一点,我需要创建一个随机数并检查它是否存在于表中.

a:
$rnumber = rand(1, 10);
$queryresult = $mysqli->query("SELECT uniquerandomcolumn FROM tbldata WHERE uniquerandomcolumn =" . $rnumber);

if ($queryresult->num_rows > 0) //if random number exists a row would be returned
{goto a;}  //try again
else {//insert into table}
Run Code Online (Sandbox Code Playgroud)

php

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