hak*_*kre 16
要导入所有全局变量incl.超全局和参数的冲突名称进入函数范围:
extract($GLOBALS, EXTR_REFS | EXTR_SKIP);
Run Code Online (Sandbox Code Playgroud)
问题出在这里的超级全球.您可能想要排除它们,这是一个列表(PHP 5.2):
/**
* PHP Superglobals
*/
array (
1 => 'GLOBALS',
2 => '_ENV',
3 => 'HTTP_ENV_VARS',
4 => '_POST',
5 => 'HTTP_POST_VARS',
6 => '_GET',
7 => 'HTTP_GET_VARS',
8 => '_COOKIE',
9 => 'HTTP_COOKIE_VARS',
10 => '_SERVER',
11 => 'HTTP_SERVER_VARS',
12 => '_FILES',
13 => 'HTTP_POST_FILES',
14 => '_REQUEST',
15 => 'HTTP_SESSION_VARS',
16 => '_SESSION',
)
Run Code Online (Sandbox Code Playgroud)
你得到参数变量名称get_defined_vars.
这也是为什么相反不那么棘手,get_defined_vars不返回超全局,只返回局部变量的原因.
在global创建全球范围内的变量的引用,所以它实际上是一个局部变量是一个别名具有相同名称的全局变量.此外,一些本地变量正在冲突导出,因此应采取一些预警,如深奥的变量名称:
foreach(get_defined_vars() as ${"\x00\x00"} => ${"\x00\x01"})
{
$GLOBALS[${"\x00\x00"}] =&$${"\x00\x00"};
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是喜欢globals的$GLOBALS超全局数组包含全局变量的引用一样,所以这在这里创建的引用也是如此.如果您通过导入这是特别需要global或&$GLOBALS[...]或extract以上等.或者,如果您的局部变量是私有类成员的别名(不要这样做;)):
示例/ 演示:
<?php
/**
* Make all variables global, PHP
* @link http://stackoverflow.com/q/1909647/367456
*/
error_reporting(~0);
function bar($goo = 1)
{
global $foo;
$foo++;
$baz = 3;
foreach(get_defined_vars() as ${"\x00\x00"} => ${"\x00\x01"})
{
$GLOBALS[${"\x00\x00"}] =&$${"\x00\x00"};
}
}
$foo = 1;
bar();
echo '$goo: ', var_dump($goo); # int(1)
echo '$foo: ', var_dump($foo); # int(2)
echo '$baz: ', var_dump($baz); # int(3)
Run Code Online (Sandbox Code Playgroud)
快速而肮脏的方式:
$GLOBALS += get_defined_vars();
Run Code Online (Sandbox Code Playgroud)
我不知道这个hack是否可移植(它适用于PHP 5.3.1)并且我怀疑这些对象是克隆的.