PROLABLOG

プログラミング学習に
役立つ情報を
お届けしていきます。

  1. HOME
  2. ブログ
  3. 初心者つまずき解消
  4. 【PHP】グローバルスコープとローカルスコープを理解しよう!

【PHP】グローバルスコープとローカルスコープを理解しよう!

皆さんこんにちは!
プログラミング初心者さんがつまずきやすいポイントを丁寧に解説、解消していく「初心者つまずき解消ブログ」です。

プログラミング初学者の間は、変数の出力結果が意図しないものになる時ってよくありますよね?
今回はそういった機会が減らせる、変数が使える範囲についての記事です。


突然ですが、以下のコードの出力結果は何になるかわかりますか?

<?php $prolab = "prolab";
function varEcho(){
  echo $prolab;
}

varEcho();

ブラウザで出力を確認してみるとこんなエラーが…

意味は「変数prolabは定義されていません」という内容です。

予想は当たっていましたか?
もう一度コードを見直してみましょう。

<?php $prolab = "prolab";
function test(){
  echo $prolab;
}

test();

冒頭で変数$prolabを宣言していますね。
次にその値を出力する関数testを定義し、最後に呼び出すというシンプルなコードです。

何も問題なさそうに見えますよね。

実は変数にはスコープというものがあり、これが今回変数$prolabが出力しない原因です。

スコープとはどんなものかというと、変数を定義した場所によって、その変数の有効範囲(使える場所)が決まるというものです。
ここではグローバルスコープとローカルスコープの2つのスコープを紹介します。

グローバルスコープとは関数外で定義された変数のスコープのことを言い、ローカルスコープとは関数内で定義された変数のスコープのことを言います。

ローカルスコープとグローバルスコープのそれぞれの例を見ていきましょう。

ローカルスコープの変数は、その変数が定義された関数の外では呼び出せません。

<?php

function test(){
  // 関数内のためローカルスコープの変数として定義
  $prolab = "prolab";
  // 関数内のためローカルスコープの$prolabを参照
  echo $prolab;
}

test(); // 出力:prolab
// グローバルスコープの$prolabを参照。しかしグローバルスコープで$prolabは宣言されていない。
echo $prolab; // 出力:Notice: Undefined variable: prolab

グローバルスコープの変数は関数内で呼び出せますが、globalキーワードを使い事前にグローバル変数を使うことを宣言しなければなりません。

<?php

// 関数外のため$prolabはグローバルスコープの変数
$prolab = "prolab";

function test1() {
  // 関数内のためローカルスコープの$prolabを参照。しかしローカルスコープの$prolabは定義されていない。
  echo $prolab;
}

function test2() {
  // 事前にグローバルスコープの$prolabを使うことを宣言
  global $prolab;
  // 関数内だがglobalキーワードでの宣言があるためグローバルスコープの$prolabを参照
  echo $prolab;
}

test1(); // 出力:Notice: Undefined variable: prolab
test2(); // 出力:prolab

ここまで来たら冒頭のコードでなぜエラーが出たかわかったでしょうか?

コードを見直してみましょう。
変数$prolabは関数外で定義されているため、グローバルスコープの変数です。 関数test内では$prolabの値を出力しようとしていますが、globalキーワード宣言がないため、ここではローカルスコープの$prolabを参照しています

しかしローカルスコープでは$prolabは宣言されていないため、最終的に「Notice: Undefined variable: prolab」のエラーがでるといった流れです。

<?php

  // グローバルスコープの$prolab
  $prolab = "prolab";

  function test(){
  // ローカルスコープの$prolabを参照
  echo $prolab;
 }

test(); // 出力:Notice: Undefined variable: prolab

「変数の出力結果が予想していたものと違う」といった状況を減らすためにも、日頃から「変数のスコープ」を意識してコードを書けるようにしていきましょう。

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


関連記事