Is there a way to make all variables global?
-
1If it's really impractical to set a variable global in a generic function, you can always make use of the $GLOBALS array (i.e. $GLOBALS['var_name']) – Bretticus Mar 29 '12 at 17:28
6 Answers
To import all global variables incl. superglobals and clashing names of parameters into the functions scope:
extract($GLOBALS, EXTR_REFS | EXTR_SKIP);
The problem is with the superglobals here. You might want to exclude them, here is a list (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',
)
You get the parameter variable names with get_defined_vars
.
That's also the reason why the opposite is less tricky, get_defined_vars
does not return the superglobals, only the local variables.
The global
creates a reference to the variable of the global scope, so it's actually a local variable that is an alias to the global variable with the same name. Also some local vars are clashing to export, so some pre-cautions like esoteric variable names should be taken:
foreach(get_defined_vars() as ${"\x00\x00"} => ${"\x00\x01"})
{
$GLOBALS[${"\x00\x00"}] =&$${"\x00\x00"};
}
Note that like globals
the $GLOBALS
superglobal array contains references to the global variables as well, so this creates references here as well. This is especially needed if you import via global
or &$GLOBALS[...]
or the extract
like above. Or if you have local variables that are aliases to private class members (don't do that ;)):
Example/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,119
- 16
- 12

- 193,403
- 52
- 435
- 836
It doesn't matter what you're trying to do, but this is a bad way of going about it. You'll be much better off just passing variables as arguments to functions or by declaring them global there.
but in short, there is no simple way to do it without a lot of global statements.

- 41,512
- 37
- 133
- 184
Quick and dirty way:
$GLOBALS += get_defined_vars();
I don't know if this hack is portable (it works on PHP 5.3.1) and I suspect the objects are cloned.

- 7,372
- 1
- 27
- 44
-
1Object should not be cloned, but it does not work with aliasing. But I'd say it's pretty close, and other things have more overhead: http://stackoverflow.com/a/10980563/367456 (Added the answer for completeness reasons) – hakre Jun 11 '12 at 12:59
-
Important note: this will *not* overwrite any existing global variable, but only add the ones that didn't exist before, due to [the way the `+` operator works between arrays](http://php.net/manual/en/language.operators.array.php). Do `foreach (get_defined_vars() as $k => $v) $GLOBALS[$k] = $v;` if you want to overwrite. Or better yet: never do this at all. – Jeto Oct 23 '18 at 21:04
I think this can help foreach($GLOBALS as $name => $value) global $$name;
put it inside the function and you'll have all defined variables visibles

- 312
- 4
- 11
You Can simple make them a reference to $GLOBALS
foreach($GLOBALS as $k => $v)
$$k=&$GLOBALS[$k];
Explanation of the code:
$GLOBLAS is a superglobal variable (visible everywhere). Basicly it contains all variables
$$ means the variable with the name of the value of the variable you wrote
Bit weird to explain in a foreign language so here's an example:
$color='blue';
$blue='foo';
echo $$color;
will output
foo
$k=& $v;
means that $k is a reference to $v

- 31
- 1
This is really not a good practice to make all variables GLOBAL with respect to security. To add variables as global you will have to add GLOBAL keyword each time you are going to access. Alternative approach is the use of array $GLOBAL.

- 87
- 1
- 3