有没有办法让所有变量全局化?
答案 0 :(得分:16)
导入所有全局变量incl。超全局和参数的冲突名称进入函数范围:
extract($GLOBALS, EXTR_REFS | EXTR_SKIP);
问题在于superglobals。您可能想要排除它们,这是一个列表(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',
)
您可以使用get_defined_vars
获取参数变量名称。
这也是为什么相反的方法不那么棘手,get_defined_vars
不返回超全局,只返回局部变量。
global
创建对全局范围变量的引用,因此它实际上是一个局部变量,它是具有相同名称的全局变量的别名。还有一些本地变量出现冲突,所以应该采取一些像奥斯特变量名这样的预先警告:
foreach(get_defined_vars() as ${"\x00\x00"} => ${"\x00\x01"})
{
$GLOBALS[${"\x00\x00"}] =&$${"\x00\x00"};
}
请注意,与globals
类似,$GLOBALS
超全局数组也包含对全局变量的引用,因此这也会在此处创建引用。如果您通过上面的global
或&$GLOBALS[...]
或extract
导入,则尤其需要这样做。或者,如果您的局部变量是私有类成员的别名(不要这样做;)):
实施例/ Demo:
<?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)
答案 1 :(得分:9)
快速而肮脏的方式:
$GLOBALS += get_defined_vars();
我不知道这个hack是否可移植(适用于PHP 5.3.1)并且我怀疑这些对象是克隆的。
答案 2 :(得分:8)
你要做什么并不重要,但这是一个糟糕的方式。将变量作为参数传递给函数或通过将变量声明为全局变量,你会好得多。
但简而言之,没有很多全局陈述,没有简单的方法可以做到这一点。
答案 3 :(得分:6)
我认为这可以帮助foreach($GLOBALS as $name => $value) global $$name;
将其置于函数中,并且您将所有已定义的变量显示为
答案 4 :(得分:4)
您可以简单地将它们作为对$ GLOBALS的引用
foreach($GLOBALS as $k => $v)
$$k=&$GLOBALS[$k];
代码说明:
$ GLOBLAS是一个超全局变量(随处可见)。基本上它包含所有变量
$$表示变量,其名称为您编写的变量的值
用外语解释有点奇怪,所以这是一个例子:
$color='blue';
$blue='foo';
echo $$color;
将输出
foo
$k=& $v;
表示$ k是对$ v的引用