【PHP】変数スコープについて
先日部下に、スコープについて教えてくださいと言われました。
そこがまた、私自身不鮮明だった部分だったので、備忘録です。
スコープについて
言語によってスコープの違いはあると思います。
今回は、PHPについてです。
そもそも、スコープとは、プログラミングをする上で
変数名や関数名を参照できる範囲のことを言います。
PHPマニュアルを参考にさせていただいてます。
スコープの種類
PHPでは、以下の3種類のスコープが存在しています。
1. ローカルスコープ
2. グローバルスコープ
3. スーパーグローバル
1. ローカルスコープ
関数内でのスコープのことをいいます。
確認のための、コードが以下です。
結果は以下となります。
echoValで定義した$valが、呼び出しその1では、何も表示されていないため
ローカル変数扱いとなっていることが分かるかと思います。
2. グローバルスコープ
関数内で定義されていない変数のスコープになります。
確認用コードは以下になります。
この結果は以下です。
このように、呼び出しその2でNoticeエラーが発生し、$valなんて変数定義されてないよ
と、怒られてしまいす。
これは、グローバルという名がついているものの、関数内で参照することが出来ないためです。
これを回避するには、コードを以下のように修正しましょう。
globalキーワードを使用することにより、グローバル宣言となり、関数外の変数も参照できるようになります。
ですが、これくらいであれば、引数参照でいいと思います。
他ファイルで定義している変数を、違うファイルの関数で参照したいときに
他ファイルをrequireし、globalキーワードを使用するのが一般的でしょう。
今回部下から質問のあった部分も、ここに該当します。
また、defineで定義した定数もグローバルスコープ扱いとなります。
スーパーグローバル
全てのスコープで参照可能な組み込みの変数です。
以下が該当します。
- $GLOBALS
- $_SERVER
- $_GET
- $_POST
- $_FILES
- $_COOKIE
- $_SESSION
- $_REQUEST
- $_ENV
よくセッションや、ポスト値を参照する際に使うやつらです。
だからといって、何でもかんでもスーパーグローバル変数に入れると、後でなにやってるのか追うのが大変なので、私は推奨しません。
まとめ
用法用量を守って、だれでもわかる、気持ちの良いコーディングを心がけましょう。