phpのclass継承機能をおさらい

こんにちは。今回はphpでのClassの継承に関する機能を軽くおさらいしたいと思います。継承自体は知っているけど細かいところを忘れてしまった人向けです。

クラスを継承する

まずは基礎中の基礎、クラスを継承する方法です。class定義にextendsと継承するクラス名を記述します。

// 動物クラスを継承する犬クラス
class Dog extends Animal {
  //
}

上記の例ではAnimal(動物)クラスを継承したDog(犬)クラスを定義しています。継承されたAnimalクラスを親クラス、スーパークラスと呼びます。継承したDogは子クラス、サブクラスと言います。この場合、AnimalはDogのスーパークラス、DogはAnimalのサブクラスという位置づけとなります。

サブクラスはスーパークラスのメンバをそのまま引き継ぎます。サブクラスをインスタンス化すると、スーパークラスの機能を使えるということですね。

親のメソッドをオーバーライドする

サブクラスはスーパークラスのメソッドを使うことができます。しかし場合によっては、サブクラスでメソッドの挙動を変えたい場合がでてきます。そんな時に使えるのがオーバーライドです。オーバーライドとは文字通り、スーパークラスのメソッドをサブクラス側に定義することで、挙動を「上書き」する機能です。

以下、AnimalをDogが継承しています。Animalのbark(鳴く)メソッドをDog側でオーバーライドしています。オーバーライドの記述は単純です。同名のメソッドをサブクラス側に定義することで実現できます。

オーバーライドすることで、サブクラス側のメソッドが呼ばれるようになります。

// 動物クラス
class Animal {

    protected $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName(){
        return $this->neme;
    }

    // 動物が鳴く
    public function bark() {
        return $this->name . ' barks';
    }
}

// 動物を継承した犬クラス
class Dog extends Animal {

    // 犬が鳴く(動物クラスのbarkをオーバーライド
    public function bark() {
        return $this->name . ' barks Wan Wan';
    }
}

スーパークラスのメソッドを呼ぶ

オーバーライドはサブクラスのメソッドでスーパークラスのメソッドを上書きするので、スーパークラスのメソッドは使えなくなります。ときにはスーパークラスのメソッドを呼びたい場合もあります。そのようなときはparent::[スーパークラスのメソッド]で呼び出すことができます。以下はDogからAnimalのコンストラクタを呼んでいます。

class Dog extends Animal {

    public function __construct($name) {
        // 親クラスのコンストラクタを呼ぶ
        parent::__construct($name);
    }
    ...
}

継承、オーバーライドを禁止する final

クラスを継承させたくない、メソッドをオーバーライドさせたくない場合はfinalを付与することで実現することができます。

final class Dog extends Animal {

    final public function bark() {
        return $this->name . ' barks Wan Wan';
    }
}

子クラスからのみアクセスを許可する protected

protectedのアクセサを使用すればサブクラスからのみアクセスを許容します。オーバーライドすることが前提のメソッドはprotectedにしておくと良いでしょう。

class Animal {

    protected $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName(){
        return $this->neme;
    }

    // Animalを継承したクラスからのみ参照可能。
    protected function bark() {
        return $this->name . ' barks';
    }
}

class Dog extends Animal {

    public function __construct($name) {
        parent::__construct($name);
    }

    public function bark() {
        return $this->name . ' barks Wan Wan';
    }
}

まとめ

今回はphpのclassの継承機能についておさらいしました。オーバーライドとスーパークラスの呼び出しは、混乱しやすい箇所なのでしっかり理解することが大切だと改めて思いました。意外とわかっているようでわかっていないのが継承ですよね。