Сделайте все переменные глобальными, PHP - PullRequest
10 голосов
/ 15 декабря 2009

Есть ли способ сделать все переменные глобальными?

Ответы [ 6 ]

16 голосов
/ 11 июня 2012

Для импорта всех глобальных переменных, в т.ч. суперглобальные и врезка имен параметров в область действия функций:

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)

9 голосов
/ 15 декабря 2009

Быстрый и грязный путь:

$GLOBALS += get_defined_vars();

Я не знаю, переносим ли этот хак (он работает на PHP 5.3.1), и я подозреваю, что объекты клонированы.

8 голосов
/ 15 декабря 2009

Неважно, что вы пытаетесь сделать, но это плохой способ сделать это. Вам будет намного лучше просто передавать переменные в качестве аргументов функциям или объявлять их глобальными.

но вкратце, не существует простого способа сделать это без большого количества глобальных утверждений.

6 голосов
/ 11 августа 2011

Я думаю, что это может помочь foreach($GLOBALS as $name => $value) global $$name; поместить его в функцию, и у вас будут все видимые переменные, видимые

4 голосов
/ 12 февраля 2014

Вы можете просто сделать их ссылкой на $ GLOBALS

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

Пояснение к коду:

$ GLOBLAS - это суперглобальная переменная (видимая везде). В основном он содержит все переменные


$$ означает переменную с именем значения переменной, которую вы написали

Немного странно объяснять на иностранном языке, поэтому вот пример:

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

echo $$color;

выведет

foo

$k=& $v;

означает, что $ k является ссылкой на $ v

0 голосов
/ 26 августа 2015

Это действительно не очень хорошая практика делать все переменные глобальными в отношении безопасности. Чтобы добавить переменные как глобальные, вам нужно будет добавлять ключевое слово GLOBAL каждый раз, когда вы собираетесь получить доступ. Альтернативный подход - использование массива $ GLOBAL.

...