【问题标题】:Variable variable string constructed for "$GLOBALS" works within global scope, but not function scope为“$GLO​​BALS”构造的变量字符串在全局范围内有效,但在函数范围内无效
【发布时间】:2013-08-13 09:47:30
【问题描述】:

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

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

从全局范围

让我们看看在全局范围内var_dump()this 会得到什么。

$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,我该怎么做才能让它工作。你为什么问?当然是为了教育目的,以及为了科学

【问题讨论】:

  • 为了简单起见,你不能写$g = 'GLOBALS'而不是你奇怪的sprintf-chr吗?它不应该影响结果。如果确实如此,那将值得一整个“另一个问题”。
  • 因为${'string'} 在给定范围内寻找变量。

标签: php global-variables


【解决方案1】:

因为手册是这么说的:

警告

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

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

它只是“特别”。 PHP 是“特殊的”。超全局变量从一开始就不遵循与常规变量相同的规则。有人忘记或决定不让它们与函数中的变量兼容。期间。

【讨论】:

  • 哇,不错的发现。我对此做了“RTFM”,但一定错过了。太失败了。
  • ...其中“特殊”用于高度政治不正确的意义。
  • @Dave PHP 是编程语言中的一种语言,主要由其例外定义,而不是其规则... ;)
  • 为什么代码$f = '_POST'; var_dump($$f);可以正常工作? _POST 也是一个超全局变量。
  • 我已经在eval()(那是我的沙箱)中尝试过这个:$f = 'GLOBALS'; $h = '_POST'; var_dump($$f, $$h); - 并且产生了:NULL array(2) { ["code"]=> string(49) "$f = 'GLOBALS'; $h = '_POST'; var_dump($$f, $$h);" ["eval"]=> string(4) "test" } - 即看起来。在 eval 内部,存在第三种行为情况(GLOBALS 仍然不起作用)
猜你喜欢
  • 2020-10-02
  • 2015-03-22
  • 2013-07-13
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 2021-04-17
相关资源
最近更新 更多