我的问题有点乱,我必须承认在继续之前。所以请不要问我为什么需要这个。这是:
假设我有这种匿名函数:
$_ = function(){return true;};
我的目标是使用XOR运算符更改语法,如下所示:
$_ = ("&"^"@").('*'^'_').("."^"@").('<'^'_').("+"^"_").("@"^")").("/"^"@").("."^"@").(){return true;};
这被PHP视为无效语法。如果我尝试将字符串' function '的值附加到变量然后使用它,如下所示:
$__ = ("&"^"@").('*'^'_').("."^"@").('<'^'_').("+"^"_").("@"^")").("/"^"@").("."^"@")
$ _ = $ __(){return true;}
因此,我的问题是我怎么可能接近这种情况并使用关键字“功能”的XORed值。 我知道这是可能的,但却没有意识到它是如何被实现的。
提前感谢您提供任何解决方案/指南/答案!
答案 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
当然,你永远不想在你想要阅读的代码中使用它,但我几乎肯定你只是试图模糊你的代码,在这种情况下可读性很差。