Для импорта всех глобальных переменных, в т.ч. суперглобальные и врезка имен параметров в область действия функций:
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
, как указано выше. Или, если у вас есть локальные переменные, которые являются псевдонимами частных членов класса (не делайте этого;)):
Пример / Демо * +1031 *: * * тысяча тридцать-дв
<?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)