2009-12-15 118 views
6

有没有办法让所有变量全局?使所有变量全局,PHP

+31

请不要:( – 2009-12-15 19:36:26

+1

如果在通用函数中设置变量全局实际上不切实际,您可以始终使用$ GLOBALS数组(即$ GLOBALS ['var_name']) – Bretticus 2012-03-29 17:28:48

回答

9

你试图做什么并不重要,但这是一个不好处理的方法。只要将变量作为参数传递给函数,或者在函数中声明它们就可以了。

但简而言之,没有很多全球性声明没有简单的方法。

8

快速和肮脏的方式:

$GLOBALS += get_defined_vars(); 

我不知道这是黑客便携式(它适用于PHP 5.3.1),我怀疑对象被克隆。

+1

对象不应该被克隆,但它不适用于锯齿,但我会说它非常接近,其他的东西有更多的开销:http://stackoverflow.com/a/10980563/367456(为完整性原因添加了答案) – hakre 2012-06-11 12:59:06

5

,我认为这可以帮助foreach($GLOBALS as $name => $value) global $$name;把它里面的功能,你就会有所有定义的变量可见参数

15

要导入所有的全局变量含。超全局变量和参数到功能范围冲突名称:

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) 
+2

你是一个勇敢的勇敢的人;-) +1 – PeeHaa 2012-06-11 13:17:09

2

你可以简单的使他们成为一个参考$ GLOBALS

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

解释代码:

$ GLOBLAS是一个超全局VA riable(随处可见)。Basicly它包含了所有变量


$$意味着你写

有点怪异外语所以在这里解释变量的值的名称的变量是一个例子:

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

echo $$color; 

将输出

foo 

$k=& $v; 

意味着$ k为$ V

0

参考这实在不是一个很好的做法,使所有变量的全局相对于安全性。要将变量添加为全局变量,每次要访问时都必须添加GLOBAL关键字。另一种方法是使用数组$ GLOBAL。