Есть ли способ сделать все переменные глобальными?
Импортировать все глобальные переменные, включая. суперглобалы и сопоставление имен параметров в области функций:
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
, get_defined_vars
не возвращает суперглобалы, а только локальные переменные.
global
создает ссылку на переменную глобальной области видимости, поэтому на самом деле это локальная переменная, которая является псевдонимом для глобальной переменной с тем же именем. Кроме того, некоторые локальные вары сталкиваются с проблемой экспорта, поэтому необходимо принять некоторые предостережения, такие как имена эзотерических переменных:
foreach(get_defined_vars() as ${"\x00\x00"} => ${"\x00\x01"}) { $GLOBALS[${"\x00\x00"}] =&$${"\x00\x00"}; }
Обратите внимание, что подобно globals
массивам суперглобальный массив $GLOBALS
содержит ссылки на глобальные переменные, поэтому это также создает ссылки здесь. Это особенно необходимо, если вы импортируете через global
или &$GLOBALS[...]
или extract
как 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)
Неважно, что вы пытаетесь сделать, но это плохой путь. Вам будет намного лучше передавать переменные в качестве аргументов в функции или объявлять их глобальными.
но, короче говоря, нет простого способа сделать это без большого количества глобальных операторов.
Быстрый и грязный способ:
$GLOBALS += get_defined_vars();
Я не знаю, переносится ли этот хак (он работает на PHP 5.3.1), и я подозреваю, что объекты клонированы.
Я думаю, что это может помочь foreach($GLOBALS as $name => $value) global $$name;
поместите его внутри функции, и вы будете иметь все определенные переменные видимости
Вы можете просто сделать их ссылкой на $ GLOBALS
foreach($GLOBALS as $k => $v) $$k=&$GLOBALS[$k];
Объяснение кода:
$ GLOBLAS – сверхглобальная переменная (видимая везде). В основном он содержит все переменные
$$ означает переменную с именем значения переменной, которую вы написали
Немного странно объяснять на иностранном языке, вот пример:
$color='blue'; $blue='foo'; echo $$color;
выйдет
foo
$k=& $v;
означает, что $ k является ссылкой на $ v
Это не очень хорошая практика, чтобы сделать все переменные GLOBAL в отношении безопасности. Чтобы добавить переменные как глобальные, вам придется добавлять ключевое слово GLOBAL каждый раз, когда вы собираетесь получать доступ. Альтернативный подход – использование массива $ GLOBAL.