【PHP】抽象クラスについての解説【基本と応用】
抽象クラスとは?
抽象クラスとは、オブジェクト指向プログラミングにおけるクラスの一種で、具体的なインスタンスを作成できないクラスです。 これは「テンプレート」として機能し、子クラスに共通の振る舞いやメソッドの実装を強制するために使用されます。
PHPでは、abstract
キーワードを使用して抽象クラスを定義します。
抽象メソッドとは?
抽象クラスには、通常のメソッドと「抽象メソッド」の両方を含めることができます。 抽象メソッドとは、メソッドの定義(シグネチャ)のみを持ち、実装を持たないメソッドのことです。
抽象メソッドは、abstract
キーワードを使って宣言され、派生クラス(子クラス)で必ず実装される必要があります。
なぜ抽象クラスを使うのか?
抽象クラスを使用する理由はいくつかあります。
- コードの再利用性を高めるため
- 強制的に特定のメソッドを実装させるため
- 共通の機能をまとめ、拡張性を向上させるため
基本的な抽象クラスの例
以下は、基本的な抽象クラスの例です。
abstract class Animal {
// 抽象メソッド(サブクラスで必ず実装される)
abstract public function makeSound();
// 具体的なメソッド(そのまま使用可能)
public function sleep() {
echo "Sleeping...";
}
}
class Dog extends Animal {
public function makeSound() {
echo "Woof!";
}
}
$dog = new Dog();
$dog->makeSound(); // 出力: Woof!
$dog->sleep(); // 出力: Sleeping...
実践的な使用例
例えば、異なる種類の支払い方法を扱うクラスを作成する場合、抽象クラスを利用できます。
abstract class Payment {
abstract public function processPayment($amount);
public function validateTransaction() {
echo "Transaction validated!";
}
}
class CreditCardPayment extends Payment {
public function processPayment($amount) {
echo "Processing credit card payment of $amount";
}
}
class PayPalPayment extends Payment {
public function processPayment($amount) {
echo "Processing PayPal payment of $amount";
}
}
$payment1 = new CreditCardPayment();
$payment1->processPayment(1000); // 出力: Processing credit card payment of 1000
$payment1->validateTransaction(); // 出力: Transaction validated!
$payment2 = new PayPalPayment();
$payment2->processPayment(500); // 出力: Processing PayPal payment of 500
抽象クラスとインターフェースの違い
PHPには「インターフェース」もありますが、抽象クラスとの違いを理解することが重要です。
抽象クラス | インターフェース |
---|---|
通常のメソッドと抽象メソッドの両方を持てる | すべてのメソッドが抽象メソッド |
プロパティを定義できる | プロパティを持てない |
単一継承のみ可能 | 複数のインターフェースを実装可能 |
例えば、以下のようにインターフェースを使用できます。
interface Logger {
public function log($message);
}
class FileLogger implements Logger {
public function log($message) {
echo "Logging to file: $message";
}
}
まとめ
PHPの抽象クラスは、コードの再利用性を向上させ、共通の振る舞いを子クラスに強制する便利な仕組みです。
主なポイント:
- 抽象クラスは直接インスタンス化できない
- 抽象メソッドを含めることで、子クラスに特定のメソッドの実装を強制できる
- インターフェースと違い、通常のメソッドやプロパティを持つことができる
状況に応じて、抽象クラスとインターフェースを適切に使い分けましょう。