php goto变量

时间:2011-10-14 11:30:54

标签: php goto

我想知道在PHP中是否可以使用这样的东西

$goto = 'end';
goto $goto;

当我使用它时,我得到Parse error: syntax error, unexpected T_VARIABLE, expecting T_STRING

此外,我将如何做这样的事情(考虑a()返回truefalse

a() or goto end;

而不是更长的版本

if (!a()) goto end;

非常感谢!

  • 纯粹理论上:)

后来编辑:这肯定有很多反应。我想提到两个PHP争论最多的领域(goto和eval)有助于得到一些强烈的反应。无论如何,我要感谢那些努力摆脱他们的“偏执狂”的人(正如有人在评论中所说)。我特别要感谢DaveRandom和genesis的答案。

只是为了让事情变得清晰,让一些人放心:我知道不使用goto的原因。但是对于每个“规则”都有例外。

作为最后一点,我想了解实际投票问题的人的逻辑。这不是一个有效的问题,是不是很清楚,是否可以通过使用搜索引擎轻松回答?我想我永远不会有你的行动动机,“down-vote-user”:)。

4 个答案:

答案 0 :(得分:7)

Goto只能像这样工作

10:
//something

goto 10;

end:
//something

goto end;

但你的一个是不可能的

是的,我知道不鼓励使用goto,但实际问题的答案比这些DO NOT USE GOTO GOTO IS EVIL

要好得多

附录: eval goto

你真的不想这样做:

$goto = 'end';

eval(<<<EOD

    goto $goto;
    return; 

    end: 

    echo 'end';
EOD
);

Demo

答案 1 :(得分:4)

我能看到这个工作的唯一方法就是你这样做:

$goto = 'end';
eval("goto $goto;");

<强>无论其

  • 这可能根本不起作用(我没有随时可用的5.3安装进行测试)
  • eval() 应该不惜一切代价避免 99.9%的情况
  • 同上goto。这很少是答案 - 如果你发现自己使用goto,你可能会更好地检查代码的结构。

大多数时候,人们使用goto来避免混乱的if-else结构,但是你可以做一些(略微)更好的事情,这实现了同样的事情:将代码块包装在do {} while (FALSE);中。这意味着您可以调用break跳过代码块的其余部分并直接跳到最后。这些也可以嵌套,因此您可以调用break 2;等跳到正确的位置。

我知道有很多人在这种方法上不同意我的看法 - 让虐待风暴开始......

答案 2 :(得分:3)

即使有可能,也不要使用goto。这样做是这样的:

$goto = 'end';
$goto();

function end() {
  echo "This is run\n";
  exit();
}

您也可以使用$this->$goto()在对象上下文中执行此操作 - 有时非常方便。

答案 3 :(得分:1)

无法做到这一点(使用goto)。除了离开(嵌套)循环之外,你不应该使用goto来做任何事情。
使用goto完成的所有其他操作都可以通过“更好”和更少混淆的方法和代码结构来完成,因此您应该更喜欢这些!