【问题标题】:Apply XOR operator in a lambda function在 lambda 函数中应用 XOR 运算符
【发布时间】:2013-08-13 06:11:44
【问题描述】:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 不能直接使用变量中的关键字。您必须使用eval 或从字符串创建一个函数并执行它或其他东西。
  • 确实如此,但我该怎么做呢?我无法评估 XOR 值。
  • 你必须eval整个事情;您只是不能使用字符串中的关键字,除非您再次运行解析器。
  • eval('$_ = ' . ('&amp;'.'@')./* ... */ . '(){return true;};');

标签: php function xor


【解决方案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

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

【讨论】:

  • 感谢您的回答,这完全满足了我的问题!良好的信息和良好的口语。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2013-04-20
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2010-12-03
  • 2016-10-17
  • 2015-01-16
相关资源
最近更新 更多