php 自动加载变量 class 名称

php autoload variable class name

谁能解释一下这是如何工作的:

${(int)![=12=]=$variable->other['class']}::my_static_method();

在这个 Whosebug 问题的答案中:

它是一个变量变量语句,使用布尔语句结果创建一个全局变量名在第一个${ }

  • ${
    • 创建变量变量。
  • (int)
    • 将以下语句的结果转换为整数
  • !
    • 不是语句,反转布尔结果。
  • [=15=]
    • 创建一个变量[=16=]
    • 这通常会导致解析错误,其中需要 T_VARIABLE 而不是 T_LNUMBER
  • =
    • 设置[=16=]变量。
  • $variable->other['class']
    • 这是一个对象变量,在别处定义,我不知道它做什么或它包含什么。
  • }
    • 第一个变量变量名结束。
  • ::
    • 从布尔语句创建的 class 名称调用静态方法

所以通俗地说,它可以创建以下语句:

::my_static_method();

为什么是数字?因为变量名是由布尔语句创建的,即 true 或 false,它被倒置并转换为整数。 在 PHP truefalse 中等于 10.

所以 </code> 失败,<code>[=16=] 成功。


总的来说,请记住您正在绕过 PHP 语法错误解释器。虽然可变变量的特性旨在创建动态变量名称,但我不认为它们意味着它会像这样被滥用,因此它可能意味着您的代码可能会与更新版本的 PHP 中断。一个例子是 ,其中 PHP 7 的结果是 What? Tom Just Want To Lov€ Tina Arrr!

只是说,使用可变变量语句无论如何都是糟糕的编程习惯。

它的作用与:

[=10=]=$variable->other['class'];//value here lets say is 'myClass'
[=10=]::my_static_method();//here now is myClass::my_static_method(); called

为什么使用(int)!? 因为他只会耍花招。

print (int)![=13=]=$variable->other['class']; 的结果是 0

因为如果这里设置了什么[=15=]=$variable->other['class'],

print (bool)[=16=]=$variable->other['class']; 将是 true.

然后它将通过!取反,所以它变成false,最后用(int)0

这就是之前设置的变量的名称:[=22=]

但是只给全局变量一个数字是非常糟糕的做法。

通常所有变量必须以 _A-Za-z 开头。

不知道为什么把它作为示例删除,也许是为了取笑人们。

根本不要使用这个!

只是为了展示它是如何完成的;)(工作代码)

error_reporting(0);
define(0x7F,' ..the crazy Girl');
define('§','at? ');
define('_',' Wh');
${'$#?!'} = ' Arrr!';
$♂ = Tom;
$♀ = Tina;
$c = get_defined_constants();
print  _  . § . $♂ .' '.  Just . ' ' .  Want . ' ' . To ." ". Lov€ ." ". $♀ . $c[127] . ${'$#?!'};
//result: What? Tom Just Want To Lov€ Tina ..the crazy Girl Arrr!

随时发疯。 :-)