PHP プログラミング

【PHP】static、非staticなメソッドの違いと使い方

static(静的)と非static(動的)の違い

staticは静的とも呼ばれ、変化がないことを表します。
つまり、引数以外のものによって値が変化しないメソッドのことをstaticメソッドまたは静的メソッドと呼びます。

staticメソッドの例
PHP
/** 
* @param int $a
* @param int $b
* @return int
*/
public static function sample(int $a, int $b): int
{
  return $a + $b;
}

一方で非staticは動的とも呼ばれ、変化があることを表します。
つまり、引数以外のものによって値が変化するメソッドのことを非staticメソッドまたは動的メソッドと呼びます。

非staticメソッドの例
PHP
/** 
* @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メソッドの呼び出し方
PHP
class A
{
  //staticメソッド
  public static function sample1() {
    ...
  }
  //同クラスからの呼び出し
  public function sample2() {
    self::sample1();
  }
}

class B
{
  //別クラスからの呼び出し
  public function sample3() {
    A::sample1();
  }
}

非staticメソッドはインスタンス化を必要とするため、自分自身を$thisで表します。
また、メソッドへのアクセスは->を使用します。

非staticメソッドの呼び出し方
PHP
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となる例
PHP
class A
{
  //非staticメソッド
  public function sample1() {
    ...
  }
  //同クラスからの呼び出し(非推奨)
  public function sample2() {
    $this::sample1();
  }
}

class B
{
  //別クラスからの呼び出し(非推奨)
  public function sample3() {
    A::sample1();
  }
}

まとめ

非staticメソッドはインスタンス化を必要とする分インスタンス化の度にメモリを使うため、複数のクラスで非staticメソッドが呼ばれるとその分処理が重たくなってしまいます。
対してstaticメソッドはプログラムの実行時にメモリを確保して以降はインスタンス化の際にメモリを使わないため、処理負荷軽減のためにもstaticメソッドを積極的に使っていくことをおすすめします。

  • この記事を書いた人

Usagi

▶︎ 新米エンジニア ▶︎ Usagi Blog 運営 ▶︎ 関西在住 ● 主にプログラミングについての学びを発信中

-PHP, プログラミング