1

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

假设我有一个这样的匿名函数:

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

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

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

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

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

$_ = $__(){返回真;}

因此,我的问题是如何处理这种情况并使用关键字“ function ”的异或值。我知道这是可能的,但无法理解它是如何实现的。

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

4

1 回答 1

1

不幸的是,PHP 不允许您使用计算值作为关键字。为了过度简化,PHP 分为三个阶段:词法分析、解析和执行。在解析过程中使用关键字,并在执行期间计算您的 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

当然,您永远不想在您打算可读的代码中使用它,但我几乎可以肯定您只是想混淆您的代码,在这种情况下,可读性会很差。

于 2013-08-12T02:33:37.173 回答