PHPのinterfaceと抽象クラスの違いを初心者向けにやさしく解説!
生徒
「PHPのインターフェースとか抽象クラスって、何が違うんですか?初心者にはややこしく感じます…」
先生
「たしかに最初は混乱しやすいですね。でも、それぞれの特徴をきちんと理解すれば使い分けもできるようになりますよ!」
生徒
「たとえばどんなときにinterfaceを使って、どんなときにabstract classを使えばいいんですか?」
先生
「よし、今日はPHPのinterfaceと抽象クラスの違いを、図やたとえも使いながら、わかりやすく説明していきましょう!」
1. interface(インターフェース)とは?
PHPのinterface(インターフェース)は、一言でいうと「そのクラスが必ず持っていなければならない機能(メソッド)」を約束するための設計書です。
最大の特徴は、インターフェースの中には「具体的な処理(どう動くか)」を一切書かないことです。「どんな名前のメソッドが必要か」というルールだけを定義します。
たとえば、プログラミング未経験の方なら「家電の操作」をイメージしてみましょう。テレビでもエアコンでも、メーカーが違っても「電源を入れる」「電源を切る」という操作(ルール)は共通ですよね。この「共通の操作ルール」がインターフェースにあたります。
以下のサンプルコードは、移動できるもの(Movable)というルールを作った例です。
interface Movable {
// 「歩く」という機能が必要!というルール
public function walk();
// 「止まる」という機能が必要!というルール
public function stop();
}
このように定義しておくことで、このMovableというインターフェースを使うすべてのクラス(人間、ロボット、動物など)に対して、「必ずwalkとstopというメソッドを中身まで含めて作ってくださいね」と強制することができます。
もし、このルールに従ったクラスで「walk」を作り忘れると、PHPが「ルール違反ですよ!」とエラーを出して教えてくれるため、多人数での開発や大規模なプログラムでもミスを防ぐことができるのです。
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)