《PHP8上級試験対策》staticメソッドと非staticメソッドの違いを理解する

  • URLをコピーしました!

はじめに

PHP8 上級試験では「staticメソッドと非staticメソッドの呼び出し方の違い」が頻出ポイントです。特に、:: 演算子で非staticメソッドを呼び出そうとしたときに何が起こるかを理解していないと、試験でつまずきやすいです。本記事では、実際のコード例とアスキーアート図解を使って、その仕組みをわかりやすく整理します。

キーワード:staticメソッド / 非staticメソッド / :: 演算子 / インスタンス /

目次

staticメソッドとは?

static が付いたメソッドは「クラスそのものに属する」メソッドです。インスタンスを生成せずに、クラス名から直接呼び出すことができます。

class Hoge {
    public static function func() {
        echo __METHOD__, "\n";
    }
}

Hoge::func(); // 実行OK

出力結果:

Hoge::func

非staticメソッドを::で呼び出すと?

一方、static が付いていないメソッドは「インスタンスに属する」ため、$this を利用することを前提としています。

そのため、次のコードはエラーとなります。

class Hoge {
    public function funcThis() {
        var_dump($this);
    }
}

Hoge::funcThis(); // 非staticをstatic風に呼び出し

実行結果:

Fatal error: Uncaught Error: Non-static method Hoge::funcThis() cannot be called statically

図解で理解する

staticメソッド(OK)

   +-------------------+
   |      Hoge         |
   |-------------------|
   | static func()     |  <-- クラスに属する
   | funcThis()        |
   +-------------------+
          |
          |  クラス名::func()
          v
   Hoge::func();   ---> 実行OK

非staticメソッドを::で呼び出す(NG)

   +-------------------+
   |      Hoge         |
   |-------------------|
   | static func()     |
   | funcThis()        |  <-- インスタンスに属する
   +-------------------+
          |
          |  クラス名::funcThis()
          v
   Hoge::funcThis();  ---> Fatal error !!
                       (インスタンスが無いので $this が使えない)

非staticメソッドの正しい呼び方

   $h = new Hoge();   // インスタンス生成
       |
       v
   +-------------------+
   |   $h (Hoge)       |
   |-------------------|
   | ->funcThis()      |
   +-------------------+
          |
          v
   $h->funcThis();   ---> 実行OK
                       ($this が参照できる)

試験での誤答パターン

誤りやすい例:「非staticメソッドも::で呼べるがNoticeが出るだけ」
→ これは古いPHP(5系)の挙動。PHP8ではFatal errorで実行が止まる

まとめ

  • staticメソッド → クラスに属する、インスタンス不要、$this は使えない。
  • 非staticメソッド → インスタンスに属する、$this が使える。
  • PHP8では非staticを::で呼ぶとFatal errorになる。

このあたりを押さえておけば、試験問題でのひっかけにも冷静に対応できます。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次