PHPでは、グローバル変数を参照するために、$GLOBALSと呼ばれる変数があらかじめ定義されています。
しかし、どのように使えば良いのか理解できていない人もいるのではないでしょうか。
「globalって単語も見かけるけど、違いがよく分からない……」
上記の悩みを抱えている方に向けて、今回は、
$GLOBALSとglobalキーワードの違い
について解説します。
目次
$GLOBALSはグローバル変数を格納した連想配列
$GLOBALSは、PHPで定義された連想配列の一種です。グローバル変数を参照したり値を設定したりすることが可能で、変数名をキーとして対応する変数の値が格納されています。
$GLOBALSの性質を理解するためには、PHPにおける変数のスコープについて把握するのが大きなポイントです。
ここでは、変数のスコープと$GLOBALSの関係について説明します。
変数のスコープと$GLOBALSの関係
変数には、自身が生存できる範囲(スコープ)が存在し、変数を定義した場所によってスコープが決まります。
PHPにおける変数のスコープは、以下の2種類があります。
- ローカル変数:関数の中で定義され、関数の中でのみ生存
- グローバル変数:関数の外で定義され、関数の外でのみ生存
ローカル変数は、関数の中で定義される変数です。関数の中で参照できる一方で、関数の外や他の関数から参照することはできません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php function sample_func() { // smaple_func関数内でローカル変数を定義 $val = "Hello world"; // 定義した関数の中で参照できるので // 「Hello world」と表示される echo $val; } function sample_func_2() { // 別の関数で定義した変数は参照できないため // 「Warning: Undefined variable $val」が出力される echo $val; } // 関数外の領域から参照できないため // 「Warning: Undefined variable $val」が出力される echo $val; sample_func(); sample_func_2(); |
グローバル変数は、関数の外で定義される関数です。関数の外で参照できる一方で、関数の中で直接参照できません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php // 関数の外でグローバル変数を定義 $val = "Hello world"; // 関数の外であれば参照できるため // 「Hello world」と表示される echo $val; function sample_func() { // 関数の中ではグローバル変数を直接参照できないため // 「Warning: Undefined variable $val」が出力される echo $val; } sample_func(); |
ただし、関数の中でグローバル変数を参照する方法は存在します。その方法の1つが、$GLOBALSを参照することです。
【PHP】ローカル変数とは?グローバル変数との違いや注意点は?$GLOBALSは関数内でグローバル変数を参照できる
$GLOBALSを参照すれば、関数の中でグローバル変数を参照することができます。$GLOBALSは、連想配列としてすべてのグローバル変数を管理しているため、すべてのグローバル変数を参照可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php // グローバル変数を定義 $val_1 = "Variable 1"; $val_2 = "Variable 2"; $val_3 = "Variable 3"; function sample_func() { // $GLOBALSを介して、関数内でグローバル変数を参照可能 // 「Variable 1」と表示される echo $GLOBALS['val_1']; // 「Variable 2」と表示される echo $GLOBALS['val_2']; // 「Variable 3」と表示される echo $GLOBALS['val_3']; } sample_func(); |
また、$GLOBALSを介してグローバル変数の値を書き換えることも可能です。$GLOBALSを通して書き換えた値は、元のグローバル変数にも反映していることも覚えておきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php // グローバル変数を定義 $val_1 = "Variable 1"; function sample_func() { // $GLOBALSを介して、関数内でグローバル変数の値を変更 $GLOBALS['val_1'] = "Hello world"; // 変更後の文字列「Hello world」と表示される echo $GLOBALS['val_1']; } // 変更前の値「Variable 1」と表示される echo $val_1; sample_func(); // 値の変更は、グローバル変数自身にも反映されるので、 // 変更後の値「Hello world」と表示される echo $val_1; |
$GLOBALSの使い方
$GLOBALSの性質について理解したところで、ここからは、$GLOBALSの使い方についてくわしく解説していきます。
$GLOBALSの参照
$GLOBALSは連想配列なので、キーにグローバル変数名を指定することで対象の変数にアクセスできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php $val_a = 1; $val_b = "apple"; $val_c = 3.14; sample_func(); function sample_func() { // 「1」と表示される echo $GLOBALS['val_a']."<br />"; // 「apple」と表示される echo $GLOBALS['val_b']."<br />"; // 「3.14」と表示される echo $GLOBALS['val_c']."<br />"; } |
グローバル変数に配列が格納されている場合も、添字を続けて指定することでアクセス可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php $val_a = ['apple', 'banana', 'grape']; $val_b = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]; $val_c = [ 'tokyo' => 'shinjuku', 'kanagawa' => 'yokohama', 'saitama' => 'saitama', 'chiba' => 'chiba', ]; sample_func(); function sample_func() { // 「apple」と表示される echo $GLOBALS['val_a'][0]."<br />"; // 「5」と表示される echo $GLOBALS['val_b'][1][1]."<br />"; // 「yokohama」と表示される echo $GLOBALS['val_c']['kanagawa']."<br />"; } |
変数にオブジェクトが格納されている場合は、アロー演算子「->」を利用することでプロパティやメソッドにアクセスできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php class User { public $user_name; public $age; public function __construct(string $name, int $age) { $this->user_name = $name; $this->age = $age; } public function show() { echo "name: ".$this->user_name."<br />"; echo "age: ".$this->age."<br />"; } } $user = new User("Takashi", 20); sample_func(); function sample_func() { // プロパティの参照 // 「name property: Takashi」と表示される echo "name property: ".$GLOBALS['user']->user_name."<br />"; // メソッド呼び出し // 「name: Takashi // age: 20 」と表示される echo $GLOBALS['user']->show(); } |
PHPのアロー演算子とは?初心者にもわかりやすく解説します
$GLOBALSの値設定
先述したように、$GLOBALSを利用してグローバル変数の値を設定することも可能です。参照する場合と同様に、中身が配列であれば添字で指定、オブジェクトであればアロー演算子「->」で指定することでアクセスします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?php class User { public $name; public $age; public function __construct($name, $age) { $this->name = $name; $this->age = $age; } public function show() { echo "Name:".$this->name."<br />"; echo "Age :".$this->age."<br />"; } } function sample_func() { // キーにグローバル変数名を指定して値を設定 $GLOBALS['val_1'] = 456; // 配列の場合も添字を続けて指定して値を設定 $GLOBALS['val_2'][0] = 100; // アロー演算子を利用してプロパティの値を設定 $GLOBALS['val_3']->name = "Kenji"; $GLOBALS['val_3']->age = 23; } // グローバル変数を定義 $val_1 = 123; $val_2 = [1, 2, 3]; $val_3 = new User("Takashi", 20); sample_func(); // 「456」と表示される echo $val_1."<br />"; // 「100」と表示される echo $val_2[0]."<br />"; // 「Name:Kenji」 // 「Age:23」と表示される $val_3->show(); |
さらに、$GLOBALSを通して新しくグローバル変数を定義できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php function sample_func() { // キーを指定してグローバル変数を定義可能 $GLOBALS['val_1'] = "Hello world"; // 「Hello world」と表示される echo $GLOBALS['val_1']; } // 変数が定義されていないので、 // 「Warning: Undefined variable $val_1」が出力される echo $val_1; sample_func(); // sample_func関数内で変数を定義したので // 「Hello world」と表示される echo $val_1; |
$GLOBALSとglobalキーワードの違い
PHPでは、$GLOBALSに似たキーワードとして「global」と呼ばれるものが存在します。名前や機能が似ているので、初めて学習する人にとっては違いが分からず悩んでしまいがちです。
$GLOBALSとglobalの共通点と相違点は、以下のとおりです。
- 共通点:関数内でグローバル変数を参照できる
- 相違点:グローバル変数の参照方法
globalは、forやifのようなキーワードの一種です。$GLOBALSと同様に、関数内でグローバル変数を参照するために使います。以下のサンプルコードのように、関数の中でglobalを加えながらグローバル変数を宣言することで、グローバル変数への参照ができるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php // グローバル変数を定義 $val_1 = "Hello world"; function sample_func() { // 関数の中でglobalキーワードを使って再宣言 global $val_1; $val_1 = "123"; // 参照できるようになったため // 「123」と表示される echo $val_1; // 値の設定も可能 $val_1 = "456"; } sample_func(); // 関数内で値を書き換えたので // 「456」と表示される echo $val_1; |
【PHP】グローバル変数(global)とは?ローカル変数との使い分け方
まとめ
いかがでしたか?
今回は、
$GLOBALSとglobalキーワードの違い
について解説しました。
$GLOBALSの性質を理解するためには、グローバル変数とローカル変数の違いを把握することが重要です。
違いを理解したうえで、どのように$GLOBALSを利用すればよいかを、実際にソースコードを書きながら身につけましょう。