这个故事的背景很长,所以简短地说——我知道 goto 很糟糕,但我别无选择,因为... PHP 缺少逗号运算符。

我有这样的模式 - 入口点作为标签给出的常规函数​​,在它里面有一个小的 lambda,它需要 goto 到那个入口点。像这样(错误的代码):

  function water()
  {
    _Entry_point_2_0:
    // ... some code
    (function() { /*...*/ ;goto _Entry_point_2_0;})();
    // ... some code
  }

我不能只是跳过函数边界,所以我的下一个想法是从 lambda 返回标签并将其用作 goto 的“值”。像这样的东西:
  function water()
  {
    _Entry_point_2_0:
    // ... some code
    goto (function() { /*...*/ ;return '_Entry_point_2_0';})();
    // ... some code
  }

这不起作用。将整个 goto 评估为字符串 eval ('goto _Entry_point_2_0;') 也不起作用。

疯狂的部分是我事先知道标签,所以你可以问为什么我不能像这样写整个函数:
  function water()
  {
    _Entry_point_2_0:
    // ... some code
    (function() { /*...*/ ;})();
    goto _Entry_point_2_0;
    // ... some code
  }

问题出在逻辑上——执行 lambda goto 现在生成 2 个表达式,而不是一个。我需要在一个表达式中实现它——执行 lambda 和 goto 必须打包在单个表达式中。

我也不能递归调用 main 函数,因为它是这项工作的重点,以避免递归调用:-)。

实现这一目标的其他方法是什么?

UPDATE 1 也许我换个说法——我想用 goto 实现的是 continue my_function 。从内部函数(即 lambda)的边界处或在其边界处执行。

UPDATE 2 的主要目标是遍历 main 函数,所以它几乎相当于:
  function water()
  {
    _Entry_point_2_0: while (true)
    {
      // ... some code
      continue (function() { /*...*/ ; return '_Entry_point_2_0'; })();
      // ... some code
    }
  }

“几乎”有两个原因。我仍然有与以前完全一样的标签问题,而且现在我遇到了将 break s 添加到循环的问题。

最佳答案

也许您正在尝试解决您的尝试解决方案而不是您的原始问题。这个问题有 XY problem 的味道。

_Entry_point_2_0:
    // ... some code
    (function() { /*...*/ ;goto _Entry_point_2_0;})();

看起来像 do while 循环:
do {
    // ... some code
} while ((function() { /*...*/ ; return $k !== 0;})());

现在不允许应用这样的匿名函数。此外,需要显式声明闭包参数。因此我的解决方案需要这样写:
$k = 10;
$f = function() use (&$k) { /*...*/ ; return $k !== 0; };
do {
    // some code
} while ( $f() );

如果你想要一个“逗号运算符”,你只需创建一个函数,它接受任意数量的参数并返回最后一个:
function begin(){
    return func_get_args()[func_num_args()-1];
}

begin(expression1, expression2, expression3); // ==> result of expression3

函数的所有参数都会被求值,因此在参数不相互依赖的情况下,它的作用相同。

关于php - 如何在PHP中传递标签?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36216763/

10-11 22:36
查看更多