9

有没有办法让所有变量都全局化?

4

6 回答 6

15

导入所有全局变量,包括。超全局变量和冲突的参数名称进入函数范围:

extract($GLOBALS, EXTR_REFS | EXTR_SKIP);

问题在于这里的超全局变量。您可能想排除它们,这是一个列表(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

示例/演示

<?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)
于 2012-06-11T12:58:05.670 回答
9

你想做什么并不重要,但这是一种不好的方式。将变量作为参数传递给函数或在那里声明它们会更好。

但简而言之,如果没有大量全局语句,就没有简单的方法可以做到这一点。

于 2009-12-15T19:11:50.250 回答
8

快速而肮脏的方式:

$GLOBALS += get_defined_vars();

我不知道这个 hack 是否可移植(它适用于 PHP 5.3.1),我怀疑这些对象是克隆的。

于 2009-12-15T19:54:31.990 回答
5

我认为这可以帮助foreach($GLOBALS as $name => $value) global $$name;将其放入函数中,并且您将看到所有已定义的变量

于 2011-08-10T23:01:11.420 回答
3

您可以简单地使它们成为对 $GLOBALS 的引用

foreach($GLOBALS as $k => $v)
   $$k=&$GLOBALS[$k];

代码说明:

$GLOBLAS 是一个超全局变量(随处可见)。基本上它包含所有变量


$$ 表示以你写的变量的值的名字命名的变量

用外语解释有点奇怪,所以这里有一个例子:

$color='blue';
$blue='foo';

echo $$color;

将输出

foo

$k=& $v;

表示 $k 是对 $v 的引用

于 2014-02-12T17:29:47.447 回答
0

对于安全性而言,将所有变量设置为 GLOBAL 确实不是一个好习惯。要将变量添加为全局变量,您必须在每次访问时添加 GLOBAL 关键字。另一种方法是使用数组 $GLOBAL。

于 2015-08-26T07:49:20.343 回答