我在网上找到了这段漂亮的PHP代码:
<?=($__='`@`@'^'*/).')(($_='->.<:'^'__@[_')('>'^@_,'%'^@_)),$__($_('|'^'=','|'^'&')),$__($_(':'^"\n",';'^']'^@_));
运行它时,它会生成以下文本字符串:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
为什么这样做会有效?
答案 0 :(得分:3)
你开始的是<?=(value),(value),(value);
所以你可以像这样重写它。
echo ($__='`@`@'^'*/).')(($_='->.<:'^'__@[_')('>'^@_,'%'^@_));
echo $__($_('|'^'=','|'^'&'));
echo $__($_(':'^"\n",';'^']'^@_));
第1行:
$__ = '`@`@'^'*/).'
使用^
,the bitwise operator将`@`@
移至*/).
并将$__
设置为字符串'JoIn',然后它对$_
执行此操作,将其设置为字符串'range'。
$__()
和$_()
现在是join()和range()的别名。
让第一行更容易阅读:
echo ($__='join')(($_='range')('>'^@_,'%'^@_));
在括号中包装片段用于设置var,然后将其值作为表达式传递,这样你就可以做这样的奇特事情。
一点清洁:
$__ = 'join';
$_ = 'range';
echo $__($_('>'^@_, '%'^@_));
内部函数的两个参数:'>'^@_
和'%'^@_
,是'a'和'z'。 (这些会滥用error suppression operator @
来删除警告,并将_
用作字符串,因此'>'^'_'
和'%'^'_'
)
现在您echo join(range('a', 'z'));
给了abcdefghijklmnopqrstuvwxyz
。
第二行将'|'^'='
和'|'^'&'
或A
和Z
传递给这两个函数。
第三行传递0
和9
。
最大的问题是你不应该在生产代码中使用任何这些技巧。