なぜ継承が要るか

UserAdminUser9 割同じ機能 を持つ。email / login() は両方に必要で、AdminUser だけが追加で deleteAll() を持つ。これを 2 つのクラスに コピペで書くと、ログイン処理を直したいときに 2 箇所直す ことになる。継承はこの重複を吸収する仕組み。

extends の書き方

class 子 extends 親 と書くと、親のプロパティとメソッドをそのまま引き継げる。

class User {
    public string $email;
    public function login(): void {
        echo "{$this->email} がログインしました\n";
    }
}
class AdminUser extends User {
    public function deleteAll(): void {
        echo "{$this->email} が全データを削除しました\n";
    }
}

AdminUserlogin() を書いていないのに呼べる。

is-a 関係で使う

継承の判断基準は 「子は親の役割を全部果たせるか」AdminUser is a User (管理者もユーザー) は自然なので OK。一方 Order is a PaymentGateway (注文は決済ゲートウェイ) は不自然なので、こちらはプロパティで PaymentGateway を持つ「has-a 関係」にする。

PHP は単一継承

PHP では 1 つのクラスは親を 1 つしか持てない (extends A, B は書けない)。複数の能力を組み合わせたいときは、後の章で扱う インターフェース (ch05) で契約を複数実装する形にする。

深い継承は避ける

継承は強力だが、親を直すとすべての子に波及する副作用も大きい。現代では 1〜2 段で済ませる 設計が主流。3 段以上の継承ツリーを作る前に「これは継承でいいのか」を疑うのがよい。

学習目標

ドリル

no 内容
01 User を継承した AdminUserdeleteAll() を追加する

演習: ドリル 01 — User を継承した AdminUser

やること

User クラスを定義してください。

次に User を継承した AdminUser クラスを定義してください。

最後に AdminUser のインスタンスを作って email"admin@example.com" を入れ、login()deleteAll() を順に呼んでください。

期待される出力

admin@example.com がログインしました
admin@example.com が全データを削除しました

補足: 実務ではパスワード照合・セッション発行・権限チェックが入りますが、ここでは「継承で機能を引き継ぐ」一点だけにフォーカスします。

ヒント

この章を AI に聞く

  1. 「ch01 — 継承 (extends)」のつまずきやすいポイントを、初学者向けに3つ教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

  2. 「ch01 — 継承 (extends)」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    💬 ChatGPT 📘 Claude ✨ Gemini

  3. 「ch01 — 継承 (extends)」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

🎉 受講お疲れさまでした!

ch01 — 継承 (extends)」を読み終えました。
学んだことを誰かに教えると、もっと記憶に残ります。

X で共有 Hatena LINE