静的メソッド（スタティック）と動的メソッド（インスタンス）について。とりあえず案件先に合わせてたので、改めてまとめてみた。

本日は静的メソッドと動的メソッドについて、備忘録も兼ねて書いてみました！
## 環境
__使用言語__：PHP 8.1.10

__フレームワーク__：laravel9.19

## はじめに

- 他の人のソースに合わせてstaticとかnewでメソッド使ったり、プロパティ参照してる。
- とりあえず欲しい値が取得できれば良い。
- そもそも静的メソッドと動的メソッドの違いが分からない
- 静的メソッドと動的メソッドどちらで作ろうか迷った。

自分はこんな感じで開発してたので、改めてまとめてみることにしました！



## 静的メソッドと動的メソッドとは
### 静的メソッドについて
まず静的メソッドとは、クラスの中で「static」を記述して作成したメソッドの事です。__呼び出しはクラスに対して行い、どこで呼び出しても同じ処理を行います。__

__呼び方__

```
静的メソッド
スタティックメソッド
クラスメソッド
```
と、呼ばれます。使うには下記のようにfunctionにstaticを付けます。
```Test2Controller.php
//スタティックとインスタンスを定義

class Test2Controller extends Controller
{

    public static function testStatic() 
    {
        echo "静的(スタティック）メソッド";
    }
		
    public function testInstance()
      {
        echo "動的(インスタンス)メソッド";
      }
}
```
呼び出し方は __クラス名::ファンクション名（）__　です。
クラスに対して呼び出すのでクラスメソッドとも呼びます。
```TestController.php
//呼び出し側

class TestController extends Controller
{
    public function index(){
        Test2Controller::testStatic(); // 静的（スタティック）メソッド
				}
}
```

__出力結果__

![image](https://firebasestorage.googleapis.com/v0/b/ciita-c6ea6.appspot.com/o/user%2Fimages%2FwFrL5L9gs9E75RS4?alt=media&token=996bedcf-63bb-4375-a8de-02c1fe0e3230)

### 動的メソッドについて
次に動的メソッドは、静的メソッドと違い、__インスタンスに対して呼び出し、インスタンスごとに固有の結果を返します。__
関数を定義する時にstaticは付けません。
```
呼び方
動的メソッド
インスタンスメソッド
```
と呼ばれます。

インスタンスメソッドの呼び出し方は、例えば下記のTest2ControllerクラスのtestInstance()メソッドを呼び出したいとします。
```Test2Controller.php
//スタティックとインスタンスを定義

class Test2Controller extends Controller
{

    // スタティックメソッド
    public static function testStatic() 
    {
        echo "静的(スタティック）メソッド";
    }
    // インスタンスメソッド
    public function testInstance()
      {
        echo "動的(インスタンス)メソッド";
      }
}
```

```TestController.php
//呼び出し側

class TestController extends Controller
{
    public function index(){
        // Test2Controller::testStatic(); // 静的（スタティック）メソッド

        $obj = new Test2Controller();  // インスタンス生成
        $obj->testInstance();                // 呼び出す

      }
}
```
$obj = new Test2Controller();

まず、上記記述で$obj と言うインスタンスが作れます。（インスタンス名はなんでもOK）

呼び出し方は __インスタンス->メソッド名（）__

__出力結果__


![image](https://firebasestorage.googleapis.com/v0/b/ciita-c6ea6.appspot.com/o/user%2Fimages%2FvsFYS0Ci2fsIVPf5?alt=media&token=34d39089-7b92-456d-a499-127f1b927b4c)

### 全体のソースコード
```php
class Test2Controller extends Controller
{

    // スタティックメソッド
    public static function testStatic() 
    {
        echo "静的(スタティック）メソッド";
    }
      
      // インスタンスメソッド
      public function testInstance()
      {
        echo "動的(インスタンス)メソッド";
      }
}
```
```php
class TestController extends Controller
{
    public function index(){
        Test2Controller::testStatic();   // 静的（スタティック）メソッド

        $obj = new Test2Controller();  // インスタンス生成
        $obj->testInstance();                //  動的(インスタンス)メソッド
      }
}
```

### プロパティのアクセス
静的メソッド
```
self::プロパティ
```
動的メソッド
```php
$test = new Test();
$this->douteki;
```
インスタンスメソッドからは、スタティックプロパティと、インスタンスプロパティのどちらにもアクセスできる。

### まとめ

__静的メソッド__
・インスタンスを生成せずに呼び出せるから処理が早い。（インスタンス化は処理するのに時間かかる）

・静的メソッドは、与えられた引数のみでメソッドの挙動が決まる。

・基本的に状態を変更しないので、副作用が起きないことも保証される。

・どこからでもアクセスすることができる

### 最後に

まとめてみたものの、結構深くて難しかったのでまとめきれませんでした。。。

ただ、静的メソッドと動的メソッドの概念はどのオブジェクト指向でも使うので、開発をしながら理解を深めたいと思います。