すべての変数をグローバルにする方法はありますか?
6 に答える
すべてのグローバル変数をインポートするには 関数スコープへのスーパーグローバルと衝突するパラメーターの名前:
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)
手っ取り早い方法:
$GLOBALS += get_defined_vars();
このハックが移植可能かどうかはわかりません (PHP 5.3.1 で動作します)。オブジェクトが複製されていると思われます。
これは関数内に配置するのに役立つと思いforeach($GLOBALS as $name => $value) global $$name;
ます。定義されたすべての変数が表示されます
これは、セキュリティに関して、すべての変数を GLOBAL にすることは実際には良い方法ではありません。変数をグローバルとして追加するには、アクセスするたびに GLOBAL キーワードを追加する必要があります。別のアプローチは、配列 $GLOBAL を使用することです。