はじめに
PHP では final
キーワードを使うことで「これ以上の拡張ができない」状態を指定できます。クラスやメソッドに対して利用でき、試験でも頻出のポイントです。本記事では final
の挙動を実際のコードとともに解説し、誤答しやすいポイントを整理します。
目次
final の意味
final
は「もうここで止める」という意味を持ちます。
- クラスにつける → そのクラスを継承できない
- メソッドにつける → サブクラスからオーバーライドできない
クラスに final をつけた場合
<?php
declare(strict_types=1);
error_reporting(-1);
final class Hoge {
}
class Foo extends Hoge {
}
実行結果:
Fatal error: Class Foo may not inherit from final class (Hoge)
✅ これは 正しい動作 です。final class Hoge
は「継承禁止」なので、Foo extends Hoge
はエラーになります。
アスキーアート図解(final クラス)
[final Hogeクラス]
│
▼
[Fooクラス] ← ❌ エラー!
「これ以上子クラスは作れない」というイメージです。
メソッドに final をつけた場合
class Base {
final public function greet() {
echo "Hello";
}
}
class Child extends Base {
// オーバーライドしようとするとエラー
public function greet() {
echo "Hi";
}
}
実行結果:
Fatal error: Cannot override final method Base::greet()
こちらも final
の仕様どおりで、オーバーライドは禁止です。
アスキーアート図解(final メソッド)
[Baseクラス]
greet() ← final指定
│
▼
[Childクラス]
greet() ← ❌ 上書き禁止!
呼び出しは可能ですが、オーバーライドは禁止です。
誤答パターンと試験対策
- 誤答しがち:「final クラスはインスタンス化できない」→ ❌(できます。禁止されるのは継承だけ)
- 誤答しがち:「final メソッドは呼び出せない」→ ❌(呼び出しは可能。禁止されるのはオーバーライドだけ)
👉 試験では「何ができなくなるのか?」を正確に区別して覚えることが大切です。
まとめ
final class
→ 継承禁止final method
→ オーバーライド禁止- エラーになるのは 仕様どおり であり、問題文の説明は正しい。
「final
は“止める”キーワード」と覚えておくと、試験で混乱しません。