LoginSignup
1
1

More than 5 years have passed since last update.

【PHP初学者の覚書】変数のスコープ

Last updated at Posted at 2016-09-18

関数内で定義した変数がどんな感じか確認した覚書です。

とりあえず、関数を作ってvar_dumpで出力してみる。

PHP(NG)
<?php

function array_add($var) {
    $hoge[] = $var;
}

array_add('one');

var_dump($hoge);

これでOKかと思いますが、Notice: Undefined variable: hoge ...というエラーが表示されます。

Notice(ノーティス) は注意、Undefined(アンディファインド)は未定義、variable(ヴェアリアブル)は変数という意味なので、hogeという変数が未定義だよと注意されています。

関数内に$hogeと記述していますが、これはローカル変数のため、有効範囲は関数内になります。

変数の前に globalと記述するとグローバル変数になります。

先ほどの記述に global を追加します。

PHP(NG)
<?php

function array_add($var) {
    global $hoge[] = $var;
}

array_add('one');

var_dump($hoge);

これでOKかと思いますが、今度は Parse error: syntax error, unexpected ...というエラーが表示されます。

Parse(パース)は構文解析、syntax(シンタックス)は文法という意味なので、書き方に誤りがあるから意味わからないと言われています。

globalは、変数を使う前にグローバルだよーと教えてあげる必要があります。

先ほどの記述を修正すると下記になります。

PHP
<?php

function array_add($var) {
    global $hoge;
    $hoge[] = $var;
}

array_add('one');

var_dump($hoge);

最初に global $hoge と教えてあげれば、グローバル変数だと理解するので、同じ関数内なら、そのあと使うときにglobalを付ける必要はありません。

これでエラーなく配列に追加されます。

表示結果
array(1) {
  [0]=>
  string(3) "one"
}

通常、関数内に記述した変数はローカル変数ですが、globalを付けることで、グローバル変数になりました。

通常、関数の外に記述した変数は、グローバル変数です。

array_add関数を使って追加したあとに、$hoge[] = 'two'; と記述すれば、同じグローバル変数なので、追加されるはずです。

試してみます。

PHP
<?php

function array_add($var) {
    global $hoge;
    $hoge[] = $var;
}

array_add('one');

$hoge[] = 'two';

var_dump($hoge);

予想通り、追加されました。

表示結果
array(2) {
  [0]=>
  string(3) "one"
  [1]=>
  string(3) "two"
}

今度は、array_add関数を記述する前に $hoge[] = 'zero'; を記述してみます。

PHP
<?php

$hoge[] = 'zero';

function array_add($var) {
    global $hoge;
    $hoge[] = $var;
}

array_add('one');

$hoge[] = 'two';

var_dump($hoge);

関数の外にある$hogeも関数の中にある$hogeも同じグローバル変数の$hogeを指しているので、array_add関数の前に記述した$hoge[] = 'zero';も追加されて表示されます。

表示結果
array(3) {
  [0]=>
  string(4) "zero"
  [1]=>
  string(3) "one"
  [2]=>
  string(3) "two"
}

まとめ

  • 普通に書いた変数は、グローバル変数だが、関数内に記述した変数はローカル変数(同じ変数名にしても別々の変数)
  • グローバル変数にするには、変数名の前に global を記述する
  • 事前にグローバルだよと教える必要があるので、global $hoge;のように変数を使う前に記述する

おまけ

$GLOBALSにグローバルスコープで使用可能なすべての変数が格納されています。
記述したグローバル変数が格納されているか確認しましょう。

PHP
<?php

$alpha = 1;
$beta = 2;
$gammma = 3;

var_dump($GLOBALS);

表示結果を見るとわかりますが、最後の方に追加した$alpha$beta$gammma$GLOBALSに格納されています。
記述してない_GET_POSTなどは、最初からPHPに定義されているグローバル変数です。

表示結果
array(8) {
  ["_GET"]=>
  array(0) {
  }
  ["_POST"]=>
  array(0) {
  }
  ["_COOKIE"]=>
  array(0) {
  }
  ["_FILES"]=>
  array(0) {
  }
  ["GLOBALS"]=>
  *RECURSION*
  ["alpha"]=>
  int(1)
  ["beta"]=>
  int(2)
  ["gammma"]=>
  int(3)
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1