PHP変数のスコープ


PHP変数のスコープ

はじめに

PHP7のtry catch構文を書いていると変数のスコープについて、理解できていないと思ったので理解を深めるためにまとめました。また他にPHPの変数のスコープの内容の記事がたくさんありましたが、自分のために残しておくために記述しておきます。

try catch構文の変数のスコープで疑問

わからなかったのが以下の記述です。テストAとテストBで違う点は最後の行でechoしている$testをtry catchの前で宣言しているかしていないかです。
try catchの前に宣言していない、testA.phpは正常に動くのか。$testはtryブロックの中で宣言されているためブロックの外側ではアクセスすることができないのではないかと思いました。
答えは動きます。理由は後述します。

testA.php
<?php

    try {
      $test = 'test';
    } catch(Exception $e) {
    // 何かしらの処理
    }

echo $test;
testB.php
<?php
    $test = ''; // 変数宣言をtryブロック外でしている
    try {
      $test = 'test';
    } catch(Exception $e) {
    // 何かしらの処理
    }

echo $test;

PHPのスコープと変数の種類

2つの概念を理解することスコープとは有効な範囲をしめし、変数の種類はそのスコープを組み合わせによって有効な範囲が違う

PHPのスコープには2つ種類がある

  • ローカルスコープ
    • 関数の中でのみ有効
  • グローバルスコープ
    • 関数の外でのみ有効(*関数の引数で渡すまたはglobal宣言を使うと関数内でアクセス可能)

PHPの変数の種類には4つ種類がある

  • ローカル変数
    • ローカルスコープの変数
  • グローバル変数
    • グローバルスコープの変数
  • スーパーグローバル変数
    • ローカルスコープとグローバルスコープの両方をもつスコープ(つまりどこからでもアクセスすることができる)
    • $GROBALSなど
  • スタティック変数
    • ローカルスコープで、その値はグローバルスコープと同様にずっと保持される
    • 初期化は1回しかされない

PHPはブロック内で宣言した変数は、そのブロックを出ても有効

以上のスコープと変数の種類を知った上で、tyr catch構文でtestA.phpの$testにアクセスすることができるのかについては、

ブロック内で宣言した変数はグローバル変数となる
そのため、tryブロックの後のコードでもアクセスすることができる。
関数内で定義されたのかがスコープを判断する基準になる

所感

基本のスコープに関して理解ができていなかったので、感覚的に書いていると思うので他の部分も潰していきたいですね。。。
以下のコードは不要な記述となることを覚えておきます。

testB.php
<?php
    $test = '';
    try {
      $test = 'test';
    } catch(Exception $e) {
    // 何かしらの処理
    }

echo $test;