我想知道在PHP中是否可以使用这样的东西
$goto = 'end';
goto $goto;
当我使用它时,我得到Parse error: syntax error, unexpected T_VARIABLE, expecting T_STRING
。
此外,我将如何做这样的事情(考虑a()
返回true
或false
)
a() or goto end;
而不是更长的版本
if (!a()) goto end;
非常感谢!
后来编辑:这肯定有很多反应。我想提到两个PHP争论最多的领域(goto和eval)有助于得到一些强烈的反应。无论如何,我要感谢那些努力摆脱他们的“偏执狂”的人(正如有人在评论中所说)。我特别要感谢DaveRandom和genesis的答案。
只是为了让事情变得清晰,让一些人放心:我知道不使用goto的原因。但是对于每个“规则”都有例外。
作为最后一点,我想了解实际投票问题的人的逻辑。这不是一个有效的问题,是不是很清楚,是否可以通过使用搜索引擎轻松回答?我想我永远不会有你的行动动机,“down-vote-user”:)。
答案 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
);
答案 1 :(得分:4)
我能看到这个工作的唯一方法就是你这样做:
$goto = 'end';
eval("goto $goto;");
<强>无论其强>
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
完成的所有其他操作都可以通过“更好”和更少混淆的方法和代码结构来完成,因此您应该更喜欢这些!