---
# System prepended metadata

title: phpのglobalキーワード，staticキーワード
tags: [php]

---

# phpのglobalキーワード，staticキーワード

###### tags: `php`

どっちも関数内部で宣言するキーワードである．

## globalキーワード

外部変数を変数内部で利用できるようになる．

### サンプルコード

以下は動作しない．

```php
<?php

function func()
{
    echo $x;
}

$x = 'aaa';
func()
```

https://3v4l.org/WDb5S

以下は動作する．

```diff
 <?php
 
 function func()
 {
+    global $x;
     echo $x;
 }
 
 $x = 'aaa';
 func();
```

https://3v4l.org/MBi7D

globalキーワードをつけることで，`func()` 関数が外部変数`$x` を利用するようになる．

## staticキーワード

関数内で宣言された変数は，関数呼び出しが終わるとGCされてメモリから開放されるが，[staticキーワードで宣言すれば関数終了後も保持される](https://saitodev.co/article/PHP%E3%81%A7%E9%96%A2%E6%95%B0%E5%86%85%E3%81%AE%E5%A4%89%E6%95%B0%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E9%A0%98%E5%9F%9F%E3%81%AF%E3%81%84%E3%81%A4%E8%A7%A3%E6%94%BE%E3%81%95%E3%82%8C%E3%82%8B%E3%81%8B%EF%BC%9F/)．
次に再度関数を呼び出すと，保持された内容を再度利用することができる．

### サンプルコード

```php
<?php

function func()
{
    static $x = 0;
    $x++;
    echo $x;
}

func();
func();
func();
```
https://3v4l.org/I8QrT

staticキーワードをつけた行の変数初期化処理は，1回しか実行されない様子．

### 過程で生まれた関連記事

[staticキーワードをつけた関数内定義変数をunsetするとどうなるか](https://qiita.com/taro-hida/items/308e4422bca633f078cb)

[無駄にstatic変数を使ってメモリを無駄遣いするコード](https://zenn.dev/tarohida/articles/26fb1f7b4554f8a2015f)