【PHP】クラスの継承(extends)とは? – クラスを拡張する方法を解説

クラスの定義では継承と呼ばれる既存のクラスの定義を引き継いで定義する方法があります。

ここではクラスの継承について初心者向けに解説します。

なお、クラスをご存知でない方は先に次の記事をご覧いただくことをお勧めします。

★ 目的

  • クラスの継承を理解する。
  • クラスの継承を使えるようになる。

クラスの継承とは

クラスの継承は、既存のクラスの定義を引き継いで定義する方法があります。

引き継ぐとは、既存のクラスのプロパティやメソッド等を新しいクラスでも使えるようにするということです。

親クラス・子クラス

継承では、継承元(引き継がれるクラス)をスーパークラス継承先(引き継ぐクラス)をサブクラスと呼びます。

クラスの継承の構文

クラスを継承する基本構文は次のようになります。

class サブクラス名 extends スーパークラス名 {

}

クラスの継承の使い方

サンプルコードを見ながら継承を理解していきましょう。

ソースコード

<?php

// クラス定義(サブクラス)
class Person {
    
    // 名前
    public $name;
    
    // コンストラクタ
    public function __construct( $name ) {
        $this->name = $name;
    }
    
    // プロフィールを出力する
    public function profile() {
        echo "===== プロフィール =====\n";
        echo "名前 : ".$this->name."\n";
    }
    
}

// クラス定義(スーパークラス)

class Teacher extends Person {
    
}

// インスタンス化(インスタンスの生成)
$watanabe = new Teacher('Watanabe You');

// プロフィールを出力する
$watanabe->profile();

?>

実行結果

===== プロフィール =====
名前 : Watanabe You

このコードはPersonクラスを継承したTeacherクラスを定義し、Teacherクラスのインスタンスからスーパークラス(Personクラス)のprofileメソッドを呼び出しています。

  • 04行目:Personクラスの定義。
  • 24行目:Teacherクラスの定義(Personクラスを継承)。
  • 29行目:Teacherクラスのインスタンス生成。
  • 32行目:Teacherクラスのインスタンスのprofileメソッドを呼び出し。

Teacherクラスの定義にはプロパティ・メソッドは何も記述されておりませんが、実行結果からprofileメソッドが使えていることが分かります。

これはPersonクラスを継承したことにより、プロパティやメソッドがTeacherクラスで使えるようになったということです。

ここから、サブクラスであるTeacherクラスに独自のプロパティやメソッドを追加するとができます。

ソースコード

<?php

// クラス定義(サブクラス)
class Person {
    
    // 名前
    public $name;
    
    // コンストラクタ
    public function __construct( $name ) {
        $this->name = $name;
    }
    
    // プロフィールを出力する
    public function profile() {
        echo "===== プロフィール =====\n";
        echo "名前 : ".$this->name."\n";
    }
    
}

// クラス定義(スーパークラス)

class Teacher extends Person {
    
    // 担当科目
    public $subject = '体育';
    
    // 担当科目を出力する
    public function display_subject() {
        echo "担当科目 : ".$this->subject."\n";
    }
    
}

// インスタンス化(インスタンスの生成)
$watanabe = new Teacher('Watanabe You');

// プロフィールを出力する
$watanabe->profile();
$watanabe->display_subject();

?>

実行結果

===== プロフィール =====
名前 : Watanabe You
担当科目 : 体育

先ほどのサンプルコードに次の点を追加しました。

  • 27行目:担当科目の$subjectプロパティを追加。
  • 30行目:担当科目を出力するdisplay_subjectメソッドを追加。
  • 41行目:Teacherクラスのインスタンスからdisplay_subjectメソッドを呼び出し。

実行結果から分かる通り、問題なく動作しています。

このように、継承では既存のクラスを引き継いでクラスを定義することができ、新しくプロパティやメソッドを追加することで拡張したクラスを定義することが可能になります。

まとめ

クラスの継承は既存クラスを拡張する方法です。

アプリ設計や開発スピード、コードの柔軟性等、使えると強力な記法になりますので、是非、覚えてみてください。