2009-12-15 4 views
6

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

+31

Просьба не делать :( –

+1

Если это действительно нецелесообразно устанавливать переменную global в общей функции, вы всегда можете использовать массив $ GLOBALS (т.е. $ GLOBALS ['var_name']) – Bretticus

ответ

9

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

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

8

Быстрый и грязный способ:

$GLOBALS += get_defined_vars(); 

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

+1

Объект не должен клонироваться , но это не работает с aliasing. Но я бы сказал, что это довольно близко, и другие вещи имеют больше накладных расходов: http://stackoverflow.com/a/10980563/367456 (добавлен ответ по причинам полноты) – hakre

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

2

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

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

Объяснение кода:

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


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

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

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

echo $$color; 

выведет

foo 

$k=& $v; 

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

0

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