【问题标题】:php goto variablephp转到变量
【发布时间】:2011-10-14 11:30:53
【问题描述】:

我想知道这样的事情在 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)有助于引起强烈反响。

只是为了把事情弄清楚,让一些人放心:我知道不使用 goto 的原因。但每条“规则”都有例外。

【问题讨论】:

  • goto $goto 是不可能的。你想达到什么目的?
  • 你为什么使用 goto ?你不能用函数代替吗?
  • goto 命令只能用于中断嵌套循环。
  • @Ghommey: purely theoretically :)
  • @Ghommey 在那个例子中,break 3; 会做同样的工作......

标签: php goto


【解决方案1】:

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

【讨论】:

  • @genesis:这不值得回答,即使我对 goto 不信 ;)
【解决方案2】:

我可以看到这个工作的唯一方法是如果你这样做:

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

但是

  • 这可能根本不起作用(我没有现成的 5.3 安装来测试它)
  • eval() 应不惜一切代价避免在 99.9% 的情况下
  • 同上goto。这很少是答案 - 如果您发现自己使用 goto,您最好检查一下代码的结构。

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

我知道在这种方法上会有很多人不同意我的观点 - 让滥用风暴开始吧......

【讨论】:

  • 我喜欢do {} while (FALSE); 方法。我偶尔在 Java 以及 PHP 和 JavaScript 中使用它。
  • @DaveRandom:eval goto 仅适用于作为评估代码一部分的标签。请参阅我添加到 genesis answer 的演示(在编辑之前没有看到您的答案)。
  • @NikiC:它确实有效if you define the goto label。但你真的不想那样。
  • @hakre 这是一个不同的问题。
  • @hakre 我认为上面的示例可能不起作用,因为它大致相当于在包含的文件之间执行goto,我知道这不起作用(它手册中这样说)。我没想过将整个代码包装在eval() 中,这显然会起作用,但似乎要实现这个功能需要相当长的时间,您可能首先可以通过编写更好的代码来避免这种需求.虚拟 +1 的情绪虽然...
【解决方案3】:

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

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

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

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

【讨论】:

  • 我投了反对票,但因为你的名声不高,我担心你以后会反对我所有的帖子。原因是他在问“如何像这样使用它”,而不是在问“如何解决它,我应该使用它吗?”。当你问我“如何让我的头发着火”时,我会解释如何并且还说你不应该这样做。你只做了第二点,这是错误的。
  • 谢谢@genesis。 (顺便说一句,在你关于这个线程的另一篇文章中,我认为你在寻找“附录”这个词,而不是“附录”!你的听起来不错,但正确的拉丁语是第一个 ;-)
  • 这个 sn-p 的工作方式与 goto 完全不同(在“结束”示例中,它是不正确的)。也就是说,它完成了所有的结尾工作,然后直接跳回到你调用它的地方。这对于名为end 的东西很可能毫无用处,除非该函数也是exits。不过,我会说,它比尝试使用 eval 更可怕。
【解决方案4】:

没有办法做到这一点(goto)。此外,除了留下(嵌套)循环之外,您不应该将 goto 用于任何事情。
可以用goto 完成的所有其他事情都可以用“更好”、更少混淆的方法和代码结构来完成,所以你应该更喜欢那些!

【讨论】:

    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多