为“$ GLOBALS”构造的变量变量字符串在全局范围内工作,但不在函数范围内工作

时间:2013-08-13 09:47:31

标签: php global-variables

  

重要提示$GLOBALS是肮脏和邪恶的。不要使用它们。永远。从来没有   请关注它不起作用的事实而不是为什么你首先要这样做,这纯粹是关于技术练习的理论问题。

这是一个相当奇怪的。我正在尝试使用名为$GLOBALS的字符串构建变量变量。

来自全球范围

让我们看看var_dump()在全球范围内我们得到了什么。

$g = sprintf('%s%s%s%s%s%s%s', chr(71), chr(76), chr(79), chr(66), chr(65), chr(76), chr(83));
var_dump($$g);

结果是一组全局变量,您可以看到here。大!所以,让我们在一个函数中尝试这个。

从功能范围

首先,让我们确保我们可以在函数中实际执行$GLOBALS检查。

function globalAllTheThings()
{
    var_dump($GLOBALS);
}

globalAllTheThings();

结果是:它的工作原理 !!您可以看到此here

现在,让我们尝试我们在全局范围内使用的第一个测试,看看会发生什么。

function globalAllTheThings()
{
    $g = sprintf('%s%s%s%s%s%s%s', chr(71), chr(76), chr(79), chr(66), chr(65), chr(76), chr(83));
    var_dump($$g);
}

globalAllTheThings();

为了简单起见

你也可以尝试这个而不用这种奇怪的混淆(不要问)。

function globalAllTheThings()
{
    $g = 'GLOBALS';
    var_dump($$g);
}

globalAllTheThings();

返回NULL 。那是什么意思?为什么它返回NULL,我该怎么做才能使其正常工作。你为什么问?当然是出于教育目的,对于科学

ALL THE THINGS, SRSLY

1 个答案:

答案 0 :(得分:4)

因为手册说的是:

  

警告

     

请注意,变量变量不能与函数或类方法中的PHP的超全局数组一起使用。变量$this也是一个无法动态引用的特殊变量。

     

http://php.net/manual/en/language.variables.variable.php

这只是“特别”。 PHP是“特殊的”。 Superglobals与常规变量的规则不同。有人忘了或决定不让它们兼容函数中的变量变量。周期。