在lambda函数中应用XOR运算符

时间:2013-08-12 01:31:43

标签: php function xor

我的问题有点乱,我必须承认在继续之前。所以请不要问我为什么需要这个。这是:

假设我有这种匿名函数:

$_ = function(){return true;};

我的目标是使用XOR运算符更改语法,如下所示:

$_ = ("&"^"@").('*'^'_').("."^"@").('<'^'_').("+"^"_").("@"^")").("/"^"@").("."^"@").(){return true;};

这被PHP视为无效语法。如果我尝试将字符串' function '的值附加到变量然后使用它,如下所示:

$__ = ("&"^"@").('*'^'_').("."^"@").('<'^'_').("+"^"_").("@"^")").("/"^"@").("."^"@")

$ _ = $ __(){return true;}

因此,我的问题是我怎么可能接近这种情况并使用关键字“功能”的XORed值。 我知道这是可能的,但却没有意识到它是如何被实现的。

  

提前感谢您提供任何解决方案/指南/答案!

1 个答案:

答案 0 :(得分:1)

不幸的是,PHP不允许您将计算值用作关键字。为了过度简化,PHP有三个阶段:lexing,parsing和execution。在解析过程中使用关键字,并在执行期间计算您的XOR。要将计算值用作关键字,您必须重做解析过程。

幸运的是,在PHP中,可以使用eval,尽管它必须是一段全新的代码,而不是一个function令牌。 eval需要一大堆代码,因此您需要将整个代码组合成一个字符串:

$myKeyword = 'function';  // XORs don't matter; the problem is it's calculated
$code = '$myResult = ' . $myKeyword . '() { return true; };';

然后您可以将其传递给eval

eval($code);  // you could, of course, bypass the intermediate $code variable

您的功能现在位于$myResult

$myResult();  // => true

当然,你永远不想在你想要阅读的代码中使用它,但我几乎肯定你只是试图模糊你的代码,在这种情况下可读性很差。