9

すべての変数をグローバルにする方法はありますか?

4

6 に答える 6

15

すべてのグローバル変数をインポートするには 関数スコープへのスーパーグローバルと衝突するパラメーターの名前:

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

例/デモ:

<?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)
于 2012-06-11T12:58:05.670 に答える
8

手っ取り早い方法:

$GLOBALS += get_defined_vars();

このハックが移植可能かどうかはわかりません (PHP 5.3.1 で動作します)。オブジェクトが複製されていると思われます。

于 2009-12-15T19:54:31.990 に答える
5

これは関数内に配置するのに役立つと思いforeach($GLOBALS as $name => $value) global $$name;ます。定義されたすべての変数が表示されます

于 2011-08-10T23:01:11.420 に答える
0

これは、セキュリティに関して、すべての変数を GLOBAL にすることは実際には良い方法ではありません。変数をグローバルとして追加するには、アクセスするたびに GLOBAL キーワードを追加する必要があります。別のアプローチは、配列 $GLOBAL を使用することです。

于 2015-08-26T07:49:20.343 に答える