こんにちはエンジニアのオータケです!
皆さんスコープを知っていますか?
多くのプログラミング言語にはスコープという概念があります。
このスコープという考え方を理解しないと思わぬバグが生まれてしまうことがあります。
本記事を読んでもらうことで、
・スコープとはなにか
・ローカル変数について
・グローバル変数について
・static変数について
といった基本的な内容と
・他のファイルにある変数の呼び出し
といった実践でつまづきそうな内容について解説しています。
スコープとは?
スコープについて知る
まずスコープとはなんでしょうか?
スコープとはある場所で定義した変数や関数を使える範囲のことをスコープといいます。
(日本語で可視範囲といいます。)
これだけだと少しわかりづらいかもしれません。
実際に解説していくことでわかっていただけるかとも思うのでコードをみてみましょう。
<?php $hoge = 1; function foo() { echo $hoge; } foo(); ?>
このソースコードでは変数hogeを定義し1を代入しています。
次に、関数fooを定義して中で変数hogeを表示しようとしています。
しかし、これは1と表示されません。
なぜでしょうか?
この次の項でその疑問に迫ります。
ローカル変数を定義して使ってみる
PHPの変数にはローカル変数とグローバル変数という2種類の変数があります。
まずこの項ではローカル変数について説明していきたいと思います。
ローカル変数とは決められた範囲内でしか使えない使用範囲が限定されている変数のことを言います。
例えば、関数の中で変数を定義した場合は、原則関数内でしかその変数を使うことができません。
次のコードのような場合です。
<?php function foo() { $hoge = 10; } foo(); echo $hoge; ?>
このサンプルの場合、関数fooの中で変数hogeに10を代入し、関数fooを呼び出したあとに変数hogeを表示しようとしています。
しかし、Undefined variableという警告が表示され実行できません。
なぜこのようなことになるのでしょうか?
それは、関数fooの中で使っている変数hogeと、関数外の変数hogeは名前は同じ名前ですがまったくの別物として扱われているからです。
この関数fooの中で使われている変数hogeのことをローカル変数と呼びます。
前項で見たサンプルコードについても同じことが言えます。
最初に定義したhogeに1を代入したのと関数fooの中で表示しようとしているhogeは全くの別物でです。
その関数fooの中の変数hogeには値が何も入っておらず(厳密には未定義状態)、表示しようとしても表示できないため警告が出てしまったのです。
では、次の項で範囲関係なく自由に変数を使いたい場合はどうすればよいかを説明します!
グローバル変数を定義して使ってみる
この項では先程のローカル変数に対してグローバル変数について解説します。
一番最初に提示したサンプルコードをもう一度みてみましょう!
<?php $hoge = 1; function foo() { echo $hoge; } foo(); ?>
このコードは前項でも説明したとおり、関数fooの中の変数hogeはローカル変数として扱われるため表示ができないというものでした。
そこで、関数内でも関数の外にあるhogeを使いたい場合には次のようにすることで同じ変数として使うことができます。
<?php $hoge = 1; function foo() { global $hoge; echo $hoge; } foo(); ?>
実行結果:
1
今回は警告が出ることなく、変数の値を表示することができました。
コードの修正点は一箇所です。
echoで表示する前にglobalという命令を使っています。
global $hoge;
このように、関数内でglobalを使って変数名を指定することで関数の中でも変数hogeを使うことができます。
では次のような場合はどうでしょうか?
<?php function foo() { $hoge = 2; } function bar() { global $hoge; echo $hoge; } foo(); bar(); ?>
このサンプルでは関数を2つ用意して関数fooの中で定義されたローカル変数hogeを関数barの中で使うという目的で書いたコードです。
実行結果を見ると何も表示されません。
つまり、関数から別の関数の中のローカル変数を扱うことはできません。
あくまでもグローバル領域にある変数だけglobalで指定して使えることになります。
<?php // ここはグローバル領域 function foo() { // ここはローカル } // ここもグローバル領域 function bar() { // ここはローカル } // ここもグローバル領域 ?>
このコードのように関数外はグローバル領域になります。
static変数とは?
先程まではローカル変数とグローバル変数の違いを説明しました。
この章ではグローバル変数と似たような動きをするstatic変数(静的変数)について解説します。
static変数を使うには変数の先頭にstaticをつけることで使うことができます。
static $hoge = 1;
このような形で使うことができます。
staticについては様々な使い方がありとても奥が深いものなので次の記事で詳しく学んでいただくのが良いかと思います!
番外編:他のファイルにある変数を呼び出したい
先程は同じソースコード(ファイル内)でglobalを使いました。
今度は別ファイルに分割した場合のglobalの使い方を見てみましょう。
sample.php
<?php $hoge = 1; ?>
sample2.php
<?php include 'sample.php'; global $hoge; echo $hoge; ?>
この2つのファイルを作りsample2.phpからsample.phpをincludeを使って呼び出します。
呼び出したあとにglobalを使うことでファイルを分割してもglobalを使うことができます。
includeってなんだろう?と思った方は次の記事がおすすめです!
この記事を見ることでincludeの使い方がよくわかります!
まとめ
今回は変数のスコープ(ローカル、グローバル)について解説しました。
グローバル変数はとても便利な機能です。
しかし、多用するとバグのもととなるためむやみに使うのはやめたいところですね!