登録日:
2025-03-23
最終更新日:
2025-03-23
第7章 7.3 継承とポリモーフィズム
7.3.1 クラスの継承 (extends)
PHPでは、クラスを継承することで、親クラス(スーパークラス)のプロパティやメソッドを子クラス(サブクラス)に引き継ぐことができます。これにより、コードの再利用性を高めることができます。
基本的な継承の例
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function makeSound() {
return "Some generic sound";
}
}
// DogクラスはAnimalクラスを継承
class Dog extends Animal {
public function makeSound() {
return "Bark! Bark!";
}
}
$dog = new Dog("Buddy");
echo $dog->name; // Buddy
echo $dog->makeSound(); // Bark! Bark!
このように、extends を使うことで Animal クラスの name プロパティを Dog クラスでも使用できます。
7.3.2 メソッドのオーバーライド
継承したクラスで、親クラスのメソッドを上書きすることを メソッドのオーバーライド(override)と呼びます。上記の makeSound() の例では、Dog クラスが Animal クラスの makeSound() メソッドをオーバーライドしています。
オーバーライドの例
class Cat extends Animal {
public function makeSound() {
return "Meow!";
}
}
$cat = new Cat("Whiskers");
echo $cat->makeSound(); // Meow!
- Dog クラスと Cat クラスは、それぞれ Animal クラスの makeSound() メソッドを独自に上書きしています。
- これが ポリモーフィズム(多態性) の一例であり、同じメソッドを持つ異なるクラスが、それぞれ異なる動作をすることができます。
親クラスのメソッドを呼び出す (parent::) 子クラスでオーバーライドしつつ、親クラスのメソッドを呼び出す場合は parent::メソッド名() を使います。
class Bird extends Animal {
public function makeSound() {
return parent::makeSound() . " (and Chirp!)";
}
}
$bird = new Bird("Sparrow");
echo $bird->makeSound(); // Some generic sound (and Chirp!)
7.3.3 インターフェースと抽象クラス
PHPでは、オブジェクト指向プログラミングをより柔軟にするために インターフェース と 抽象クラス があります。
抽象クラス (abstract)
抽象クラスは、インスタンス化できないクラスであり、継承して使用されます。中には 抽象メソッド(具体的な処理を持たないメソッド)を定義できます。
abstract class Animal {
protected $name;
public function __construct($name) {
$this->name = $name;
}
abstract public function makeSound(); // 子クラスで必ず実装する必要がある
}
// 抽象クラスを継承する
class Dog extends Animal {
public function makeSound() {
return "Bark! Bark!";
}
}
$dog = new Dog("Rex");
echo $dog->makeSound(); // Bark! Bark!
- Animal クラスは abstract なので直接インスタンス化できません。
- makeSound() は抽象メソッドなので、子クラスで必ず実装しなければなりません。
インターフェース (interface)
インターフェースは、クラスが実装すべきメソッドを定義します。異なるクラスに共通の動作を強制する場合に使用します。
interface Sound {
public function makeSound();
}
class Dog implements Sound {
public function makeSound() {
return "Bark!";
}
}
class Cat implements Sound {
public function makeSound() {
return "Meow!";
}
}
$dog = new Dog();
$cat = new Cat();
echo $dog->makeSound(); // Bark!
echo $cat->makeSound(); // Meow!
- interface ではメソッドの中身を記述できません(すべて未実装)。
- implements を使って、クラスにインターフェースを適用できます。
- 1つのクラスが複数のインターフェースを実装することも可能。
interface Animal {
public function move();
}
interface Sound {
public function makeSound();
}
class Bird implements Animal, Sound {
public function move() {
return "Flying";
}
public function makeSound() {
return "Chirp!";
}
}
$bird = new Bird();
echo $bird->move(); // Flying
echo $bird->makeSound(); // Chirp!
- Bird クラスは Animal と Sound の2つのインターフェースを実装しています。
- これにより、異なる動作を統一的に管理できるようになります。
前のページへ
第7章 7.2 コンストラクタとデストラクタ
トップページへ
PHP参考書: はじめてのPHPプログラミング