継承 (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";
}
}nameもlogin()も同じ- 後から仕様変更すると 両方 直す必要がある
extends で共通部分を親クラスにまとめる
<?php
class User {
public string $name;
public function login() {
echo "{$this->name} がログインした\n";
}
}
class AdminUser extends User {
}Userを 親クラス (スーパークラス)AdminUserを 子クラス (サブクラス)- 子は親の
nameとlogin()をそのまま使える
継承したメソッドを呼べる
<?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/