static(静的)と非static(動的)の違い
staticは静的とも呼ばれ、変化がないことを表します。
つまり、引数以外のものによって値が変化しないメソッドのことをstaticメソッドまたは静的メソッドと呼びます。
staticメソッドの例
/**
* @param int $a
* @param int $b
* @return int
*/
public static function sample(int $a, int $b): int
{
return $a + $b;
}
一方で非staticは動的とも呼ばれ、変化があることを表します。
つまり、引数以外のものによって値が変化するメソッドのことを非staticメソッドまたは動的メソッドと呼びます。
非staticメソッドの例
/**
* @param int $a
* @param int $b
* @return int
*/
public function sample(int $a, int $b): int
{
if ($a > 0) {
return $a + $b - 10;
} else {
return $a + $b;
}
}
static、非staticなメソッドの呼び出し方
staticメソッドはインスタンス化を必要としないため、自分自身を$this
ではなくself
で表します。
また、メソッドへのアクセスはスコープ定義演算子(::
)を使用します。
staticメソッドの呼び出し方
class A
{
//staticメソッド
public static function sample1() {
...
}
//同クラスからの呼び出し
public function sample2() {
self::sample1();
}
}
class B
{
//別クラスからの呼び出し
public function sample3() {
A::sample1();
}
}
非staticメソッドはインスタンス化を必要とするため、自分自身を$this
で表します。
また、メソッドへのアクセスは->
を使用します。
非staticメソッドの呼び出し方
class A
{
//非staticメソッド
public function sample1() {
...
}
//同クラスからの呼び出し
public function sample2() {
$this->sample1();
}
}
class B
{
//別クラスからの呼び出し
public function sample3() {
//インスタンス化が必要
$classA = new A();
$classA->sample1();
}
}
(非推奨)非staticメソッドを静的にコールしてはいけない
static でないメソッドをstaticメソッドとしてコールすると、 Error がスローされます。
PHP 8.0.0 より前のバージョンでは、 static でないメソッドをstaticメソッドとしてコールすることが非推奨になっており、 E_DEPRECATED レベルの警告が発生していました。
引用:static キーワード
Errorとなる例
class A
{
//非staticメソッド
public function sample1() {
...
}
//同クラスからの呼び出し(非推奨)
public function sample2() {
$this::sample1();
}
}
class B
{
//別クラスからの呼び出し(非推奨)
public function sample3() {
A::sample1();
}
}
まとめ
非staticメソッドはインスタンス化を必要とする分インスタンス化の度にメモリを使うため、複数のクラスで非staticメソッドが呼ばれるとその分処理が重たくなってしまいます。
対してstaticメソッドはプログラムの実行時にメモリを確保して以降はインスタンス化の際にメモリを使わないため、処理負荷軽減のためにもstaticメソッドを積極的に使っていくことをおすすめします。