PHPのinterfaceと抽象クラスの違いを初心者向けにやさしく解説!
生徒
「PHPのインターフェースとか抽象クラスって、何が違うんですか?初心者にはややこしく感じます…」
先生
「たしかに最初は混乱しやすいですね。でも、それぞれの特徴をきちんと理解すれば使い分けもできるようになりますよ!」
生徒
「たとえばどんなときにinterfaceを使って、どんなときにabstract classを使えばいいんですか?」
先生
「よし、今日はPHPのinterfaceと抽象クラスの違いを、図やたとえも使いながら、わかりやすく説明していきましょう!」
1. interface(インターフェース)とは?
PHPのinterface(インターフェース)は、ルールだけを決めるための「設計書」のようなものです。中には処理の中身は書かず、どんな関数(メソッド)が必要なのかだけを定義します。
たとえば、「歩く」「走る」「止まる」などの動作だけ決めて、どのように動くかはそれぞれの人やロボットで違うというイメージです。
interface Movable {
public function walk();
public function stop();
}
このように書くことで、「walk」と「stop」というメソッドを必ず作らないといけないというルールができます。
2. 抽象クラス(abstract class)とは?
abstract class(抽象クラス)は、interfaceに似ていますが、ルールだけでなく「中身(処理内容)」も一部書けるのが大きな特徴です。
「この部分は全員同じにして、この部分はそれぞれで作ってね」という感じです。たとえば、全員に共通する「IDを持つ」という機能はここに書きます。
abstract class Animal {
public $name;
public function setName($name) {
$this->name = $name;
}
abstract public function speak();
}
このようにabstractを使うと、共通する処理も定義できて便利です。
3. interfaceとabstract classの違いを表で比較
| 比較ポイント | interface | abstract class |
|---|---|---|
| 処理の中身(実装) | 書けない(定義だけ) | 一部書ける |
| プロパティ(変数) | 基本的に持てない | 持てる |
| 継承の数 | 複数可 | 1つだけ |
| 使う場面 | ルールだけ決めたいとき | 一部共通処理を使いたいとき |
4. interfaceの実装(implements)方法
interfaceは、implementsキーワードでクラスに取り入れます。ルール通りに、すべてのメソッドを必ず作る必要があります。
interface Printer {
public function printData();
}
class PDFPrinter implements Printer {
public function printData() {
echo "PDFとして印刷します";
}
}
5. 抽象クラスの継承(extends)方法
抽象クラスは、extendsキーワードでクラスに継承します。共通部分はそのまま使えますが、abstractなメソッドは必ず作らないといけません。
abstract class Vehicle {
abstract public function run();
public function stop() {
echo "止まりました";
}
}
class Car extends Vehicle {
public function run() {
echo "車が走ります";
}
}
6. interfaceとabstract classを両方使う例
実際の開発では、interfaceとabstract classを組み合わせることもよくあります。interfaceでルールを決め、abstract classで共通機能を持たせる使い方です。
interface Flyable {
public function fly();
}
abstract class Bird {
public function layEggs() {
echo "卵を産みました";
}
}
class Eagle extends Bird implements Flyable {
public function fly() {
echo "高く飛びます";
}
}
このように、複数の性質を持たせるときにとても便利です。
7. interfaceとabstract classの使い分けのコツ
初心者が迷いがちな「どっちを使えばいいの?」というポイントについて、簡単な判断基準を紹介します。
- 「ルールだけ決めたい」→ interface
- 「共通の機能も持たせたい」→ abstract class
たとえば、いろんな種類のプリンタを作るとき、印刷ルールだけ決めたいならinterface。印刷処理の中で一部を共通にしたいならabstract classを使いましょう。
8. よくある初心者のつまずきポイント
interfaceとabstract classを使いこなすには、以下のような注意点も押さえておきましょう。
interfaceはメソッドの定義だけなので、処理を書いてはいけませんabstractクラスの抽象メソッドは、必ず子クラスで作る必要があります- 複数のinterfaceを
,でつなげて実装できます(例:implements A, B)