这个故事的背景很长,所以简短地说——我知道 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/