Home > PHP

PHPのグローバル変数

2010.09.26 16:46
  PHPのグローバル変数の扱いは、Perlと逆なんですね。Perlは普通に変数を使うとだいたいが自動的にグローバル変数になってしまうのでサブルーチンの中でもそのまま呼び出すことができます。変数をサブルーチン内でローカライズしたい場合は、local宣言します。逆にPHPは放っておくと関数の外と関数内では変数が外と内で自動的に分離されます。そのため関数内に外から変数を読み込みたい時はグローバル変数として宣言するという手法になります。スコープの話はいろいろと言語によって違うので面倒です。いろいろやり方があるのでちょっと紹介。

関数の中で扱うPHPのグローバル変数

 スコープ(変数の有効範囲)を越えて変数を関数内に呼び込むにはPHPの場合、以下の4つの方法があります。
1. 関数の引数として渡す。
2. グローバル宣言をする。
3. グローバル変数としての $sampleに無理やりアクセスする。
4. defineする。
5. 特殊なグローバル変数 ($_xxx)

1. 関数の引数として渡す

$sample = "1234";
function fnc ($sample) {
    echo $sample;
}
fnc($sample);
  関数の外で定義した変数$sampleを関数の引数として渡してやることで関数内にグローバル変数を呼びこめます。また外に出したい場合は、returnで戻してやるといいです。この方法が一番ポピュラーであり且つ一番見やすいソースになると思います。内外の変数の出し入れが明示的にできるし自由度が高いです。
$sample = "1234";
function fnc ($sample) {
    return $sample;
}
$re = fnc($sample);
echo $re;

2. グローバル宣言をする

$sample = "1234";
function fnc () {
    global $sample
    echo $sample;
}
fnc();
 関数の外で定義した変数$sampleを関数内でglobalを使ってグローバル宣言します。この宣言が有効なのはこの関数のみ。他の関数内で$sampleを使う場合はそのつどグローバル宣言しないとだめです。関数の外側の変数を一時的にグローバル化する際には結構便利。globalは関数の外で使うとsyntax errorになります。この方法はローカライズされた変数をグローバル化するという方法です。

3. グローバル変数としての $sample にアクセスする

$sample = "1234";
function foo () {
    print $GLOBALS["sample"];
}
foo();
 $GLOBALSという特殊はハッシュを使ってやや強引にグローバル化してしまう方法です。$GLOBALSと複数形になっていることに注意。$GLOBALSを関数の外で使ってもエラーにはなりませんが、あんまり意味がありません。この方法は2とは逆に元々関数の外側で定義された変数を関数内でグローバル化するという方法と考えればよいのですが、このグローバル化は以下でももう一度説明していますが、関数の内外を自由に行き来できるスーパーグローバル変数です。

4. defineする

$sample = "1234";
define ("SAMPLE", $sample);

function foo () {
    print SAMPLE."<br />\n";
}
foo();
 defineで定義された値は、php内ではどこでも使えます。関数外、関数内など全然関係なく使えます。しかし設計時にちょっと工夫して整理整頓しないとわけがわからなくなるのでご注意。

スーパーグローバル変数

 PHPにはスーパーグローバル変数という不思議なものがあります。スコープに関係なくどの場所でもどのレベルでも有効みたいです。(自分で検証はしていませんが、たぶん概ね大丈夫だと思います。)スーパーグローバル変数は以下の通りです。
$GLOBALS 上記3で説明したグローバル化です。
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV
 これは全部配列です。$_SERVER、$_ENVなどはデフォルトで様々なサーバー環境の情報などを入れてくれるています。$_REQUESTは$_GET、$_POST、$_COOKIEをまとめた変数ですが殆ど使うことがないと思います。
 
 






プロフィール



  • Name :: 山上オサム ♂(39)
  • Hobby :: 武術
  • Work :: Web Designer