役立つ情報
登録日: 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プログラミング

Copyright 役立つ情報.net