Search

検索したいワードを入力してください

2019年03月28日

変数のスコープとは?PHPのスコープと変数について解説

この記事では変数のスコープについて説明します。変数にはグローバルスコープとローカルスコープがありますが、全ての変数をグローバルにすると便利で簡単に見えますが、メンテナンス面やセキュリティ面で問題が生じやすいので、基本的にグローバル変数は非推奨とされています。

変数のスコープって何?

プログラミング言語ではスコープという概念があり、これによって変数や関数の意図しない更新などによる不具合を防止しています。

この記事ではPHPにおける変数のスコープについて説明していきます。PHPの変数というのは宣言する箇所によって、有効範囲が変わります。

下記に例を記述していきます。

<?PHP
$a = 0; //ここで宣言すると変数の有効範囲はプログラム全体になります。

function addInt(){
$b = 0; //ここで宣言すると変数の有効範囲は関数の中のみになります。
}

?>

変数のスコープの種類(ローカルとグローバル)

PHPの変数のスコープには2種類あります。

上記で記述したような有効範囲がプログラム全体にある変数を「グローバルスコープ」といい、関数内だけで有効な変数を「グローバルスコープ」といいます。

グローバルスコープとは

グローバルスコープはプログラム全体からアクセスできるということです。変数をグローバルスコープで作成すれば、さまざまな関数から呼び出すことができます。

グローバルスコープの書き方

関数内でグローバルスコープの変数を使う場合は、グローバル変数として宣言しておく必要があります。
下記に例を記述していきます。

<?PHP
$a = 0; //ここで宣言すると変数の有効範囲はプログラム全体になります。

function addInt(){
global $a; //参照前にグローバル変数として宣言しておきます。
$a++;
}

addInt();

var_dump($a);
?>
【出力結果】
int(1)


グローバル変数として宣言せず、ぞのまま演算してしまうと変数の参照ができず Notice: Undefined variable...の参照エラーが発生してしまいます。

ローカルスコープとは

次にローカルスコープについて詳しく説明していきます。グローバルスコープと違い、ローカルスコープの場合は他の関数などで呼び出すことはできなくなります。

ローカルスコープの書き方

ローカルスコープはグローバルスコープとは違い、有効範囲が関数の中に限定されます。
下記に例を記述していきます。

<?PHP
$a = 0; //グローバルスコープ

function addInt(){
global $a; //※グローバル変数として宣言
$b = 0;//ローカルスコープとして宣言(この関数内でのみ有効)
$a++;
$b++;
var_dump($b);
}

addInt();

var_dump($a);
//var_dump($b);
//ローカルスコープを範囲外で参照するとエラーが発生するので、出力する場合は関数内でおこなう。

?>


関数内で宣言されたローカルスコープの変数を関数の外から参照しても、見つかりませんというエラーが表示されてしまうので、出力や参照を行う場合は関数内で処理を行います。

関数内でスコープを使うには

下記のように関数を実行するときに変数を宣言して、変数にカウントアップしていくような関数を用意します。
<?PHP
function CountUp(){
$cnt = 0; //カウント用の変数を宣言
$cnt++; //CountUp関数を実行する度に1を加算していく
var_dump($cnt);
}

CountUp();

?>
【出力結果】
int(1)

上記の関数を繰り返し実行します。
CountUp();
CountUp();
CountUp();
CountUp();
CountUp();

【出力結果】
int(1)
int(1)
int(1)
int(1)
int(1)


この場合、関数内で変数宣言する際に初期化されてしまうので、毎回1が表示されてしまいます。
この関数を使ってカウントアップさせるには変数をstaticで静的に宣言する必要があります。

static変数を使ってみよう

変数$cntを静的(static)に宣言して、再度処理を行ってみます。
<?PHP
function CountUp(){
static $cnt = 0; //カウント用の変数を宣言
$cnt++; //CountUp関数を実行する度に1を加算していく
var_dump($cnt);
}
CountUp();
CountUp();
CountUp();
CountUp();
CountUp();
?>

【出力結果】
int(1)
int(2)
int(3)
int(4)
int(5)


関数実行のたびにカウントアップしてくれるようになりました。このように、Static変数を使えば変数の値を保持したまま複数回の呼び出しを行うことができるようになります。

クラス内でStatic変数を使う

クラス内でStaticメンバ変数として宣言すると、インスタンス化なしで変数の参照ができるようになります。
例を下記に記述していきます。

<?PHP

//クラスの定義
class CountUp{
//staticメンバ変数として宣言
public static $cnt = 5;
}

//インスタンス化せずに参照可能
var_dump(CountUp::$cnt);

//演算も可能
CountUp::$cnt++;
var_dump(CountUp::$cnt);

?>

【出力結果】
int(5)
int(6)


クラスをインスタンス化することなく、そのまま参照と演算ができました。

グローバル変数を関数内で使う場合の注意点

PHPではグローバル変数を関数内で使う場合に、globalで宣言して参照する方法を上記で説明しましたが、グローバス変数にはデメリットもあります。

グローバル変数を多用すると意図しない場面で変数が書き換えられてエラーやバグの原因になったり、複数人で開発する際にメンテナンスしにくいなどの問題があります。どうしても必要という場面でない限り、基本的に関数内では引数を指定して、パラメータとして扱うようにしましょう。

パラメータを戻り値に渡す

実際に関数に引数を渡して処理を実行していくプログラムを書いていきます。

<?PHP

$count = 0;

AddInt($count); //関数を実行
var_dump($count); //元の数値を出力

//引数に対して1加算して表示する関数
function AddInt($int){
$int++;
var_dump($int);
}
?>
【出力結果】
int(1)
int(0)


関数内の処理では1加算された値が出力されました。しかし、元の$countには変化がありません。

$countにも関数内で加算された値を反映させるためには、関数に戻り値を与えて$countに再度格納する必要があります。

下記に戻り値を取得する処理を記述していきます。

<?PHP

$count = 0;

//関数を実行
$count = AddInt($count); //実行と同時に結果を取得
var_dump($count);

//引数に対して1加算して表示する関数
function AddInt($int){
$int++;
var_dump($int);

return $int; //関数の戻り値を指定
}

?>

【出力結果】
int(1)
int(1)


戻り値を取得して、出力することで結果を反映した数値を表示することができました。

他のファイルにあるPHPの変数を呼び出したい場合

他のファイルで宣言された変数の値を読み込みたい場合や、出力したい場合の方法を説明していきます。

includeの使い方

他のファイルの変数や関数を読み込んだり、HTMLファイルを読み込んだりする時に良くinclude関数が使われます。include関数には下記の2種類があります。

include('ファイルパス'); //ファイルを読み込む
include_once('ファイルパス'); //一回だけ読み込む

includeはファイルを読み込みます。include_onceは一回だけファイルを読み込みます。

クラスを定義したり、変数を初期化するようなファイルは最初に1度読み込むだけでいいのでinclude_onceの方が適切です。

実際に下記のような変数を生成したPHPファイルを作って読み込んでみます。

「price_list.php」

<?PHP

$apple = 200;
$orange = 120;
$pine = 500;
$banana = 250;

?>


上記ファイルを読み込んで、変数を表示させてみます。

<?PHP

include('./price_list.php');
var_dump($banana);

?>

【出力結果】
int(250)

読み込んだファイルの変数が表示されました。

require関数との違い

外部ファイルを読み込む関数はもう一つ「require」という関数があります。使い方も同じで、下記のように記述します。

require("ファイルパス");

include関数と比べて、読み込みエラーや関数での構文エラー発生時に処理を続行するか、停止するかの違いがあります

require関数は、エラーが発生すると以降の処理は行いません。一方include関数は、エラーが発生しても以降の処理を続行します。

上記の違いから、require関数はクラスの定義や、読み込みができなかった場合、その先の処理に影響がでる場合に使います。

include関数はHTMLや画像の表示などの画面処理のような表示できなくてもシステム上は問題ないような場合に使います。

スーパーグローバル変数

PHPにはスーパーグローバル変数というものも存在します。

スーパーグローバス変数はプログラム全体のどこからでもアクセスできる変数で、関数内でもglobalで宣言しなくても参照できます。下記がスーパーグローバル変数の一覧です。

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

例えば$_POSTはHTTP POST で渡された値、つまりフォームからの送信で渡された値を参照する時に使います。

使い方は$_POST["変数名"]という配列の形式で指定します。このスーパーグローバル変数はglobalの宣言なしで、そのまま取得することができます。

メンテナンスしやすい変数を設計しよう

グローバルスコープの変数を使えば、全ての関数からアクセスして、演算や表示処理ができます。しかし、多用するとメンテナンス性が低下したり、バグの温床になりかねません。

似たような名前の変数があり、どの変数がどのタイミングで書き換えられるか、どの場面で使うのかがわかりにくい場合、開発効率の低下を招き、速度やクオリティも低下してしまいます。

むやみに変数を生成していくのではなく、クラス化して使う用途を明確にしたり、命名規則などのルールを決めて設計することで、構築時の時間的コストは少し余分にかかりますが、のちの開発が圧倒的にやりやすくなります

最初の設計を行うときにこういった部分も意識して開発するようにしましょう。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related