静的(スタティック)メソッドと動的(インスタンス)メソッド


静的(スタティック)メソッドと動的(インスタンス)メソッドの違いとは?

静的(スタティック)メソッドとは何か?

クラスの中で「static」を記述して作成した関数の中のメソッドのこと。呼び出しはクラスに対して行い、どこで呼び出しても同じ処理を行う。クラスメソッド」という名称もよく使う。

  • 定義例
//クラスの中で定義
[アクセス権限] static function メソッド名(){
  //処理
};

動的(インスタンス)メソッドとは何か?

インスタンスに対して呼び出し、インスタンス毎に固有の結果を返す。関数を定義する時は「static」を付けない。

*インスタンスとは、クラスで定義したプロパティを受け継いでいるものを指します。
詳しくはhttps://qiita.com/non0311/items/26f18af83d84ae95bc91

  • 定義例
//クラスの中で定義
[アクセス権限] function メソッド名(){
  //処理
};

静的(スタティック)メソッドと動的(インスタンス)メソッドの違い

(1) 定義方法の違い
(2) メソッドの呼び出し方の違い
(3) アクセスできるプロパティの違い

(1) 定義方法の違い

定義する時の違いは「static」をつけるか付けないか、と「アクセス権限」の必要性。

メソッド static アクセス権限
静的(スタティック) 必須 必須
動的(インスタンス) 不要 なくてもいい(ない場合はpublic扱い)

アクセス権限について
private > protected > public (=記載なし)の順

  • private : 定義したクラス内のみ
  • protected : 継承クラス(子クラス)からもアクセス可能
  • public : クラスの外からアクセス可能
  • 記載なし(function) : publicと同じ

(2) メソッドの呼び出し方の違い

メソッド 対象 呼び出し方法
静的(スタティック) クラス クラス::メソッド名
動的(インスタンス) インスタンス インスタンス->メソッド名()

静的(スタティック)メソッドは、「->」でも呼び出せる

  • 使用例
class TestClass{

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


//「クラス::」での呼び出し
TestClass::testStatic(); //出力結果: 静的(スタティック)メソッド:
TestClass::testInstance(); //出力結果: エラー:

//「オブジェクト->」での呼び出し
$obj = new TestClass;

$obj->testInstance(); //出力結果: 動的(インスタンス)メソッド:
$obj->testStatic(); //出力結果: 静的(スタティック)メソッド:

$obj::testStatic(); //出力結果: 静的(スタティック)メソッド:
$obj::testInstance(); //出力結果: エラー:

(3) アクセスできるプロパティの違い

プロパティ 対象 呼び出し方法 クラス内での呼び出し
静的(スタティック) クラス クラス::プロパティ名 self::$プロパティ名
動的(インスタンス) インスタンス インスタンス->プロパティ名 $this->プロパティ名

「self::」は自分自身のクラスを指し、「$this」は自分自身のクラスをインスタンス化したオブジェクトを指す。
静的(スタティック)メソッドの中では「$this」が使えない、つまり、インスタンスプロパティにアクセスできない

参考文献