はじめに
PHP8 上級試験では「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になる。
このあたりを押さえておけば、試験問題でのひっかけにも冷静に対応できます。