Php 为";构造的变量字符串$“全球”;在全局范围内工作,但不在功能范围内
一个重要提示:Php 为";构造的变量字符串$“全球”;在全局范围内工作,但不在功能范围内,php,global-variables,Php,Global Variables,一个重要提示:$GLOBALS既肮脏又邪恶。不要使用它们。曾经从未有过。 请关注它不起作用的事实,而不是你为什么要这样做,这纯粹是一个关于技术练习的理论问题 这是一个相当奇怪的问题。我正在尝试使用名为$GLOBALS的字符串构造变量 来自全球范围 让我们看看当var\u dump()在全局范围内执行此操作时会得到什么 $g = sprintf('%s%s%s%s%s%s%s', chr(71), chr(76), chr(79), chr(66), chr(65), chr(76), chr(8
$GLOBALS
既肮脏又邪恶。不要使用它们。曾经从未有过。请关注它不起作用的事实,而不是你为什么要这样做,这纯粹是一个关于技术练习的理论问题 这是一个相当奇怪的问题。我正在尝试使用名为
$GLOBALS
的字符串构造变量
来自全球范围
让我们看看当var\u 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);
结果是一个全局变量数组,您可以看到。伟大的让我们在函数中试试这个
function globalAllTheThings()
{
var_dump($GLOBALS);
}
globalAllTheThings();
从功能范围
首先,让我们确保可以在函数中实际运行$GLOBALS
检查
function globalAllTheThings()
{
var_dump($GLOBALS);
}
globalAllTheThings();
结果是:它起作用了!!你可以看到这个
现在,让我们在函数的全局范围内尝试第一个测试,看看会发生什么
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();
为了简单起见
你也可以不用奇怪的困惑(不要问)
它返回NULL
。那是怎么回事??为什么它返回NULL
,我该怎么做才能使它正常工作。为什么,你问?当然是为了教育的目的,科学的目的
因为手册上说: 警告 请注意,变量不能在函数或类方法中与PHP的超全局数组一起使用。变量
$this
也是一个特殊变量,不能动态引用
它只是“特别的”。PHP是“特殊的”。超全局变量的规则与常规变量不同。有人忘记或决定不让它们与函数中的变量兼容。句号。为了简单起见,你不能用
$g='GLOBALS'
来代替你那古怪的sprintf chr
?这不应该影响结果。如果是这样的话,那就值得再问一个问题了。因为${'string'}
在给定的范围内查找变量。哇,这个发现真不错。我在这方面做了“RTFM”,但肯定错过了。多么失败的一次……在政治上使用“special”是非常不正确的。@Dave PHP是编程语言中的一种语言,它主要是由它的异常定义的,而不是由它的规则定义的……;)那么为什么代码$f=''u POST';变量转储($$f)代码>工作正常吗_POST也是一个超全局的。我在eval()
(这是我的沙盒)中尝试过这一点:$f='GLOBALS'$h="u POST";变量转储($$f,$$h)代码>-这就产生了:NULL数组(2){[“code”]=>string(49)”$f='GLOBALS';$h=''u POST';var_dump($$f,$$h);“[“eval”]=>string(4)“test”}
-也就是说,它似乎是这样。在eval中,还有第三种行为(GLOBALS仍然不起作用)