採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

継承 (extends)

テクノロジ系 / class-advanced (継承 / オーバーライド / abstract / interface / static / const / final)

継承 (extends)

Lesson 9 / Chapter 1

ゴール

ユーザーの種類 (管理者 / 一般) ごとにクラスを分けたい。

User (親)         ← 共通: name, login()
 ├── AdminUser    ← 管理者だけ: deleteAll()
 └── GuestUser    ← 閲覧のみ

共通部分を 親にまとめる、固有部分を 子に書く ができるようにする。

似たクラスを 2 つ書くと重複する

<?php
class AdminUser {
    public string $name;
    public function login() {
        echo "{$this->name} がログインした\n";
    }
}

class GuestUser {
    public string $name;
    public function login() {
        echo "{$this->name} がログインした\n";
    }
}
  • namelogin() も同じ
  • 後から仕様変更すると 両方 直す必要がある

extends で共通部分を親クラスにまとめる

<?php
class User {
    public string $name;
    public function login() {
        echo "{$this->name} がログインした\n";
    }
}

class AdminUser extends User {
}
  • User親クラス (スーパークラス)
  • AdminUser子クラス (サブクラス)
  • 子は親の namelogin() をそのまま使える

継承したメソッドを呼べる

<?php
$u = new AdminUser();
$u->name = "tanaka";
$u->login();

実行結果:

tanaka がログインした
  • AdminUser には login() を書いていないが、親 User のものが使える
  • プロパティ name も同様

子クラスで新しいメソッドを追加できる

<?php
class AdminUser extends User {
    public function deleteAll() {
        echo "{$this->name} が全データを削除した\n";
    }
}

$u = new AdminUser();
$u->name = "tanaka";
$u->login();       // 親から継承
$u->deleteAll();   // 子で追加 (管理者だけの操作)
  • 子クラスにしか無いメソッドは、親 (User) や別の子 (GuestUser) では呼び出せない
  • 本番では権限チェックも別途必要だが、ここではクラスでの分離に集中する

継承は「共通 → 親、固有 → 子」

User (親)
  ├── name
  └── login()
     ↑ 継承
AdminUser (子)
  └── deleteAll()    ← 管理者だけ持つ
GuestUser (子)
  └── (閲覧のみ・追加メソッドなし)
  • 共通部分を親に置けば、変更が 1 箇所で済む
  • 子クラスは「親 + 自分の追加分」を持つ

このチャプターでできるようになること

class 子 extends 親 で継承できる

✅ 親クラスのプロパティ・メソッドを子で使える

✅ 子クラス独自のメソッドを追加できる

✅ ロール別 (管理者 / 一般) の共通処理を親にまとめる発想ができる

→ ドリルへ

考えてみよう

既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。

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

やること

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

  • プロパティ email (string)
  • メソッド login()"{email} がログインしました" を 1 行出力する

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

  • メソッド deleteAll()"{email} が全データを削除しました" を 1 行出力する

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

期待される出力

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

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

ヒント

  • class AdminUser extends User { ... }
  • $a = new AdminUser();
  • $a->email = "admin@example.com";
  • 親の login()AdminUser に書かなくても呼べる

採点

php scripts/grade.php topics/class-advanced/ch01-inheritance/drill/01-extend/