静的(スタティック)メソッドと動的(インスタンス)メソッドの違いとは?
静的(スタティック)メソッドとは何か?
クラスの中で「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」が使えない、つまり、インスタンスプロパティにアクセスできない
参考文献