記載されている内容は2019年03月28日時点のものです。現在の情報と異なる可能性がありますので、ご了承ください。記事に記載されている情報は自己責任でご活用いただき、本記事の内容に関する事項については、専門家等に相談するようにしてください。この記事では変数のスコープについて説明します。変数にはグローバルスコープとローカルスコープがありますが、全ての変数をグローバルにすると便利で簡単に見えますが、メンテナンス面やセキュリティ面で問題が生じやすいので、基本的にグローバル変数は非推奨とされています。他のファイルにあるPHPの変数を呼び出したい場合メンテナンスしやすい変数を設計しよう変数のスコープって何?http://php.net/download-logos.phpプログラミング言語ではスコープという概念があり、これによって変数や関数の意図しない更新などによる不具合を防止しています。この記事ではPHPにおける変数のスコープについて説明していきます。PHPの変数というのは宣言する箇所によって、有効範囲が変わります。下記に例を記述していきます。//ここで宣言すると変数の有効範囲はプログラム全体になります。//ここで宣言すると変数の有効範囲は関数の中のみになります。}?>変数のスコープの種類(ローカルとグローバル)PHPの変数のスコープには2種類あります。上記で記述したような有効範囲がプログラム全体にある変数を「グローバルスコープ」といい、関数内だけで有効な変数を「グローバルスコープ」といいます。グローバルスコープとはグローバルスコープはプログラム全体からアクセスできるということです。変数をグローバルスコープで作成すれば、さまざまな関数から呼び出すことができます。関数内でグローバルスコープの変数を使う場合は、グローバル変数として宣言しておく必要があります。下記に例を記述していきます。//ここで宣言すると変数の有効範囲はプログラム全体になります。//参照前にグローバル変数として宣言しておきます。variable...の参照エラーが発生してしまいます。ローカルスコープとは次にローカルスコープについて詳しく説明していきます。グローバルスコープと違い、ローカルスコープの場合は他の関数などで呼び出すことはできなくなります。ローカルスコープの書き方ローカルスコープはグローバルスコープとは違い、有効範囲が関数の中に限定されます。下記に例を記述していきます。0;//ローカルスコープとして宣言(この関数内でのみ有効)$a++;$b++;var_dump($b);}addInt();var_dump($a);//var_dump($b);//ローカルスコープを範囲外で参照するとエラーが発生するので、出力する場合は関数内でおこなう。?>関数内で宣言されたローカルスコープの変数を関数の外から参照しても、見つかりませんというエラーが表示されてしまうので、出力や参照を行う場合は関数内で処理を行います。関数内でスコープを使うには下記のように関数を実行するときに変数を宣言して、変数にカウントアップしていくような関数を用意します。//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)に宣言して、再度処理を行ってみます。//CountUp関数を実行する度に1を加算していくvar_dump($cnt);}CountUp();CountUp();CountUp();CountUp();CountUp();?>【出力結果】int(1)int(2)int(3)int(4)int(5)関数実行のたびにカウントアップしてくれるようになりました。このように、Static変数を使えば変数の値を保持したまま複数回の呼び出しを行うことができるようになります。クラス内でStatic変数を使うクラス内でStaticメンバ変数として宣言すると、インスタンス化なしで変数の参照ができるようになります。例を下記に記述していきます。5;}//インスタンス化せずに参照可能var_dump(CountUp::$cnt);//演算も可能CountUp::$cnt++;var_dump(CountUp::$cnt);?>【出力結果】int(5)int(6)クラスをインスタンス化することなく、そのまま参照と演算ができました。グローバル変数を関数内で使う場合の注意点PHPではグローバル変数を関数内で使う場合に、globalで宣言して参照する方法を上記で説明しましたが、グローバス変数にはデメリットもあります。グローバル変数を多用すると意図しない場面で変数が書き換えられてエラーやバグの原因になったり、複数人で開発する際にメンテナンスしにくいなどの問題があります。しても必要という場面でない限り、基本的に関数内では引数を指定して、パラメータとして扱うようにしましょう。パラメータを戻り値に渡す実際に関数に引数を渡して処理を実行していくプログラムを書いていきます。AddInt($int){$int++;var_dump($int);}?>【出力結果】int(1)int(0)関数内の処理では1加算された値が出力されました。元の$countには変化がありません。$countにも関数内で加算された値を反映させるためには、関数に戻り値を与えて$countに再度格納する必要があります。下記に戻り値を取得する処理を記述していきます。//関数の戻り値を指定}?>【出力結果】int(1)int(1)戻り値を取得して、出力することで結果を反映した数値を表示することができました。他のファイルで宣言された変数の値を読み込みたい場合や、出力したい場合の方法を説明していきます。他のファイルの変数や関数を読み込んだり、HTMLファイルを読み込んだりする時に良くinclude関数が使われます。include関数には下記の2種類があります。//一回だけ読み込むincludeはファイルを読み込みます。include_onceは一回だけファイルを読み込みます。クラスを定義したり、変数を初期化するようなファイルは最初に1度読み込むだけでいいのでinclude_onceの方が適切です。実際に下記のような変数を生成したPHPファイルを作って読み込んでみます。250;?>上記ファイルを読み込んで、変数を表示させてみます。<?PHPinclude('./price_list.php');var_dump($banana);?>【出力結果】int(250)読み込んだファイルの変数が表示されました。require関数との違い外部ファイルを読み込む関数はもう一つ「require」という関数があります。使い方も同じで、下記のように記述します。require("ファイルパス");include関数と比べて、読み込みエラーや関数での構文エラー発生時に処理を続行するか、停止するかの違いがあります。require関数は、エラーが発生すると以降の処理は行いません。include関数は、エラーが発生しても以降の処理を続行します。上記の違いから、require関数はクラスの定義や、読み込みができなかった場合、その先の処理に影響がでる場合に使います。include関数はHTMLや画像の表示などの画面処理のような表示できなくてもシステム上は問題ないような場合に使います。スーパーグローバル変数PHPにはスーパーグローバル変数というものも存在します。スーパーグローバス変数はプログラム全体のどこからでもアクセスできる変数で、関数内でもglobalで宣言しなくても参照できます。下記がスーパーグローバル変数の一覧です。渡された値、つまりフォームからの送信で渡された値を参照する時に使います。使い方は$_POST["変数名"]という配列の形式で指定します。このスーパーグローバル変数はglobalの宣言なしで、そのまま取得することができます。メンテナンスしやすい変数を設計しようグローバルスコープの変数を使えば、全ての関数からアクセスして、演算や表示処理ができます。多用するとメンテナンス性が低下したり、バグの温床になりかねません。似たような名前の変数があり、どの変数がどのタイミングで書き換えられるか、どの場面で使うのかがわかりにくい場合、開発効率の低下を招き、速度やクオリティも低下してしまいます。むやみに変数を生成していくのではなく、クラス化して使う用途を明確にしたり、命名規則などのルールを決めて設計することで、構築時の時間的コストは少し余分にかかりますが、のちの開発が圧倒的にやりやすくなります。最初の設計を行うときにこういった部分も意識して開発するようにしましょう。file.2:営業マンとして活躍し、海外留学。file.4:独学よりもスクールで。他人と同じことはしない。