【6日でできるPHP入門】抽象クラスとオーバーライド

 オブジェクト指向の設計を進めると、抽象クラスオーバーライドという重要な概念に出会います。抽象クラスは「共通ルールだけを決めて実装は子クラスに任せる」ための土台となるクラスで、オーバーライドは「親クラスに定義されたメソッドの内容を、子クラスで上書きして独自の動作にする」ためのしくみです。

 この2つを理解することで、クラス設計がより柔軟で再利用しやすくなります。本記事では抽象クラスとオーバーライドの違い・使い方をサンプルを交えて丁寧に解説します。

1.抽象クラスの基本

1.1. 抽象クラスと抽象メソッドとは

用語意味・説明
抽象クラス共通ルールや枠組みだけ決め、インスタンス化できないクラス
抽象メソッドメソッド名・引数だけを定義し、具体的な内容は子クラスに任せるもの

 抽象クラスはabstractキーワードを使い、少なくともひとつは抽象メソッドを持ちます。抽象クラスは直接newできません

抽象クラスの定義例

abstract class Printer {
    abstract public function print($content);
}

1.2. 抽象クラスの特徴と利用シーン

特徴説明
インスタンス化できない。直接 new で使うことはできない。
共通の型・枠組みを強制できる。子クラスがメソッドを必ず実装する。
一部だけ実装も可能通常のメソッドも混在できる。

利用シーン例:

  • さまざまな通知(メール通知、SNS通知、プッシュ通知)の「通知する」ルールだけ抽象化し、実際の方法は子クラスで書く場合など

2.抽象クラスとオーバーライドのサンプル

 ここでは、「通知(Notification)」の抽象クラスと、それを継承して具体的なメール通知・LINE通知を行うサブクラスの例を紹介します。

ファイル名: lesson60_1.php

<?php
// 抽象クラス(Notification)を定義
abstract class Notification {
    abstract public function send($message); // 抽象メソッド

    public function info($message) { // 通常メソッドもOK
        echo "通知情報: $message<br>";
    }
}

// メール通知クラス(子)
class MailNotification extends Notification {
    // 抽象メソッドの実装(オーバーライド)
    public function send($message) {
        echo "メール送信:$message<br>";
    }
}

// LINE通知クラス(子)
class LineNotification extends Notification {
    public function send($message) {
        echo "LINE送信:$message<br>";
    }
}

// インスタンスを生成して利用
$mail = new MailNotification();
$mail->send("明日の会議は10時開始です");
$mail->info("優先度:高");

$line = new LineNotification();
$line->send("ランチに行きませんか?");
$line->info("優先度:普通");
?>

実行結果

2.1. サンプル解説

  • Notificationクラス
    abstract classで宣言し、abstract public function send($message);で「sendメソッドは必ず子クラスで実装せよ」と指示しています。
  • MailNotification, LineNotificationクラス
    両方ともsendメソッドをオーバーライドして、それぞれ独自のメッセージ出力をしています。
  • 通常メソッドinfo
    抽象クラスにも普通のメソッド(info)を定義でき、これは子クラスでそのまま利用可能です。

3.オーバーライドとは

3.1. オーバーライドの基本

 オーバーライド(上書き)とは、子クラスで親クラスの同名メソッドを再定義して、自分独自の動作を持たせることです。

親クラスのメソッド子クラスでのオーバーライド例
function print($content) { ... }function print($content) { ...新しい処理... }

ポイント

  • 引数や戻り値の型は基本的に同じにする必要があります
  • 抽象メソッドは必ずオーバーライドしなければなりません

3.2. 抽象クラス+オーバーライドのメリット

メリット説明
設計のルール強制子クラスで必ずメソッドを実装させる
処理の共通化と柔軟な拡張性抽象クラスで共通部分・拡張部分を分離

まとめ

 抽象クラスは、共通ルールや仕様を枠組みとして強制し、オーバーライドにより実際の処理を子クラスごとに分けて実装できる仕組みです。
 これにより、コードの再利用性と柔軟性が格段に高まります。PHPではabstractoverride(オーバーライドは明示せずとも定義名でOK)などの構文を正しく使いこなすことが重要です。
ぜひ実際に書いて試して、理解を深めましょう!