【PHP】グローバル変数とglobalと$GLOBALS【PHP8初級試験対策】

PHP8初級試験のためにまとめた内容を記載していきます。

## global
### 基本的な仕様
グローバル変数（関数外の変数）と同名のローカル変数（関数内の変数）を変更しても、ローカル変数の値は変更されるがグローバル変数の値は変更されない。キホンのキ。

```php
<?php
$val = "hoge";

function func01() {
    $val = "fuga";
    print "【A】".$val."\n"; 
}

func01();
print "【B】".$val."\n"; 
```

```.Result
【A】fuga
【B】hoge
```

`global`キーワードを使えば関数内からグローバル変数を変更できる。キホンのホ。

```php
<?php
$val = "hoge";

function func01() {
    global $val;
    $val = "fuga";
    print "【A】".$val."\n"; 
}

func01();
print "【B】".$val."\n"; 
```
```.Result
【A】fuga
【B】fuga
```

### `global`を宣言した時点で同名のローカル変数は参照されなくなる

`global`キーワードを宣言した時点で、グローバル変数が参照されるようになり、同名のローカル変数は参照されなくなる。また、同一関数内でも`global`キーワードを宣言するまではローカル変数のほうが参照される。

```php
<?php
$val = "hoge";

function func01() {
    $val = "fuga";    
    print "【A】".$val."\n";
    global $val;
    print "【B】".$val."\n";
}

func01();
print "【C】".$val."\n"; 
```
```.Result
【A】fuga
【B】hoge
【C】hoge
```

### `global`で宣言した変数と同名のグローバル変数がまだ存在しない場合、新たにグローバル変数が作られる

値には`null`が代入される。エラーにはならない。

```php
<?php
//$val = "hoge";

function func01() {
    $val = "fuga";
    global $val;
    print "【A】".$val."\n"; 
}

func01();      
$val = "hoge";  
func01();      
print "【B】".$val."\n"; 
```
```.Result
【A】
【A】hoge
【B】hoge
```

### `global`は宣言した関数内でのみ有効
`func01`内では`$val`を`global`で宣言しているので関数内の変更がグローバル変数に反映されているが、`func02`内では`global`を宣言していないので関数内の変更はグローバル変数に反映されない。
```php
<?php
$val = "hoge";

function func01() {
    global $val;
    $val = "fuga";
    print "【A】".$val."\n"; 
}

function func02() {
    $val = "piyo";
    print "【C】".$val."\n"; 
}

func01();
print "【B】".$val."\n";
func02();
print "【D】".$val."\n"; 
```
```.Result
【A】fuga
【B】fuga
【C】piyo
【D】fuga
```

### `global`を使わずに関数内からグローバル変数は参照できない
厳密に言うと『`global`または`$GLOBALS`』を使わずに参照することはできない。「ローカル変数に無ければ同名のグローバル変数を参照する」みたいな仕様は無い。

```php
<?php
$val = "hoge";

function func01() {
    // $val = "fuga";
    // global $val;
    print "【A】".$val."\n"; 
}

func01();
print "【B】".$val."\n"; 
```
```.Result
PHP Warning:  Undefined variable $val in /workspace/Main.php on line 7
```

### `global`を関数の外部で使ってもエラーにはならない
コード単体では特に意味はないが、このコードが外部から呼ばれた際に効力を発揮する。

```php
<?php
$val = "hoge";

function func01() {
    $val = "fuga";
    print "【A】".$val."\n"; 
}

global $val;
func01();
print "【B】".$val."\n"; 
```
```.Result
【A】fuga
【B】hoge
```

## $GLOBALS
### 基本的な仕様
関数内からグローバル変数を参照できる。キホンのキ。特別何もしなくても関数外で宣言した変数は`$GLOBALS`の連想配列の中に自動で入る。

```php
<?php
$val = "hoge";

function func01() {
    $val = "fuga";
    print "【A】".$GLOBALS['val']."\n"; 
}

func01();
print "【B】".$val."\n"; 
```

```.Result
【A】hoge
【B】hoge
```
関数内からグローバル変数の変更もできる。キホンのホ。

```php
<?php
$val = "hoge";

function func01() {
    $GLOBALS['val'] = "fuga";
    print "【A】".$GLOBALS['val']."\n"; 
}

func01();
print "【B】".$val."\n"; 
```

```.Result
【A】fuga
【B】fuga
```

### `$GLOBALS`はローカル変数に干渉しない

`global`と異なり同名のローカル変数があっても干渉しないので、ローカル変数をそのまま使うことができる。

```php
<?php
$val = "hoge";

function func01() {
    $val = "fuga";
    $GLOBALS['val'] = "piyo";
    print "【A】".$val."\n"; 
}

func01();
print "【B】".$val."\n"; 
```
```.Result
【A】fuga
【B】piyo
```
### `$GLOBALS`で存在しないグローバル変数に代入すると、グローバル変数が新たに作られる
代入した値をセットしたグローバル変数が新たに作られる。この辺りは通常の変数の仕様と同じ。

```php
<?php
// $val = "hoge";

function func01() {
    $GLOBALS['val'] = "piyo";
    print "【A】".$GLOBALS['val']."\n"; 
}

func01();
print "【B】".$val."\n"; 
```
```.Result
【A】piyo
【B】piyo
```

下の例の場合、`func01`でグローバル変数`$val`を作成しているので、その前に`$val`を参照しようとするとエラーになる。

```php
<?php
// $val = "hoge";

function func01() {
    $GLOBALS['val'] = "piyo";
    print "【A】".$GLOBALS['val']."\n"; 
}

print "【B】".$val."\n"; 
func01();
print "【C】".$val."\n"; 
```
```.Result
PHP Warning:  Undefined variable $val in /workspace/Main.php on line 9
```

### `$GLOBALS`で存在しないグローバル変数を参照すると、エラーになる
これも通常の変数の仕様と同じ。「グローバル変数に無ければ同名のローカル変数を参照する」みたいな仕様も無い。

```php
<?php
//$val = "hoge";

function func01() {
    $val = "fuga";
    print "【A】".$GLOBALS['val']."\n"; 
}

func01();
```
```.Result
PHP Warning:  Undefined global variable $val in /workspace/Main.php on line 6
```

なので、こちらのコードもエラーになる。`global`キーワードの宣言と混同しないように。

```php
<?php
//$val = "hoge";

function func01() {
    $GLOBALS['val'];
}

func01();
```
```.Result
PHP Warning:  Undefined global variable $val in /workspace/Main.php on line 5
```


## 実行環境

paiza.IOにて確認。執筆時点のバージョンは以下の通り。
>PHP 8.1.31 (cli) (built: Nov 21 2024 13:09:45) (NTS)

https://paiza.io/ja