アツログ

つけめんは、ひやもり派のあつもりです。おすすめのガジェットだったり、食だったり、プログラミングなどの雑記をあげていきます

アツログ

【PHP】変数スコープについて

あとで読む

プログラマーのイラスト

先日部下に、スコープについて教えてくださいと言われました。

そこがまた、私自身不鮮明だった部分だったので、備忘録です。

スコープについて

言語によってスコープの違いはあると思います。

今回は、PHPについてです。

そもそも、スコープとは、プログラミングをする上で

変数名や関数名を参照できる範囲のことを言います。

PHPマニュアルを参考にさせていただいてます。

スコープの種類

PHPでは、以下の3種類のスコープが存在しています。

1. ローカルスコープ

2. グローバルスコープ

3. スーパーグローバル

1. ローカルスコープ

関数内でのスコープのことをいいます。

確認のための、コードが以下です。

<?php

  function echoVal()
  {
      $val = 'ローカルスコープ';
      return $val;
  }

  echo "呼び出しその1:". $val. "\r\n";
  echo "呼び出しその2:". echoVal(). "\r\n";
  exit;
?>

結果は以下となります。

呼び出しその1:
呼び出しその2:ローカルスコープ 

echoValで定義した$valが、呼び出しその1では、何も表示されていないため

ローカル変数扱いとなっていることが分かるかと思います。

2. グローバルスコープ

関数内で定義されていない変数のスコープになります。

確認用コードは以下になります。

<?php

    $val = "グローバルスコープ";

    function echoVal()
    {
        return $val;
    }

    echo "呼び出しその1:". $val. "\r\n";
    echo "呼び出しその2:". echoVal(). "\r\n";
    exit;
?>

この結果は以下です。

呼び出しその1:グローバルスコープ
PHP Notice:  Undefined variable
呼び出しその2:

このように、呼び出しその2でNoticeエラーが発生し、$valなんて変数定義されてないよ

と、怒られてしまいす。

これは、グローバルという名がついているものの、関数内で参照することが出来ないためです。

これを回避するには、コードを以下のように修正しましょう。

<?php

    $val = 'グローバルスコープ';

    function echoVal()
    {
        global $val;
        return $val;
    }

    echo "呼び出しその1:". $val. "\r\n";
    echo "呼び出しその2:". echoVal(). "\r\n";
?>

globalキーワードを使用することにより、グローバル宣言となり、関数外の変数も参照できるようになります。

ですが、これくらいであれば、引数参照でいいと思います。

他ファイルで定義している変数を、違うファイルの関数で参照したいときに

他ファイルをrequireし、globalキーワードを使用するのが一般的でしょう。

今回部下から質問のあった部分も、ここに該当します。

また、defineで定義した定数もグローバルスコープ扱いとなります。

スーパーグローバル

全てのスコープで参照可能な組み込みの変数です。

以下が該当します。

  • $GLOBALS
  • $_SERVER
  • $_GET
  • $_POST
  • $_FILES
  • $_COOKIE
  • $_SESSION
  • $_REQUEST
  • $_ENV

よくセッションや、ポスト値を参照する際に使うやつらです。

だからといって、何でもかんでもスーパーグローバル変数に入れると、後でなにやってるのか追うのが大変なので、私は推奨しません。

まとめ

用法用量を守って、だれでもわかる、気持ちの良いコーディングを心がけましょう。