広告 PHP入門

【PHP入門】継承とオーバーライド

はじめに

前回の記事では、PHPのクラスについて紹介しました。

本記事では、PHPの継承とオーバーライドについて紹介します。

継承(extends)

継承とは、クラスが持っているメソッド(関数)やプロパティ(変数)を別のクラスに引き継がせることです。

継承元のクラスを親クラス、継承先のクラスを子クラスといいます。

スポンサーリンク

子クラスを作成するには「extends」(読み:エクステンズ)を使用します。次のように「extends」の前に子クラス名、後に親クラス名を指定します。

継承(extends)の例

継承の使用例

それでは、実際にPHPのプログラムで継承の使い方を紹介します。

次の例では「ChildClass」が「BaseClass」を継承しています。子クラスである「ChildClass」は、「BaseClass」を継承しているので、「BaseClass」の「printBase」メソッドを引き継いでいます。

[継承の例]

<?php

// 親クラス
class BaseClass
{
    public function printBase() {
        print("親クラスです<br />");
    }
}

// 子クラス
class ChildClass extends BaseClass 
{
    public function printChild() {
        print("子クラスです");
    }
}

$child = new ChildClass();
$child->printBase();
$child->printChild();

?>

[実行結果]

親クラスです
子クラスです

継承を使うメリット

例えば、次のような2つのクラス「新車クラス」と「中古クラス」があるとします。

[継承を利用しない場合の例]

<?php

// 新車クラス
class NewCar 
{
    const MANUFACTURER = "○○自動車";

    public function printCar($price) {
        print("製造元は".self::MANUFACTURER."<br />");
        print("販売価格は$price 円<br />");
    }

    public function printNewCar($price) {
        print("新車です<br />");
        $this->printCar($price);
    }
}

// 中古クラス
class OldCar
{
    const MANUFACTURER = "○○自動車";

    public function printCar($price) {
        print("製造元は".self::MANUFACTURER."<br />");
        print("販売価格は$price 円<br />");
    }

    public function printOldCar($price) {
        print("中古車です<br />");
        $this->printCar($price);
    }
}

?>

 

この2つのクラスは、どちらも車に関連するクラスであり、以下の内容がまったく同じです。

全く同じ内容

同じ内容のソースコードを色々な個所に書くと、修正する際に複数の個所を直す必要があり、保守性が悪くなります。

そのため、共通的な部品は共通機能として管理するか「継承」して管理します。(例えば、色々な個所で使う共通的な部品であれば共通機能、車クラスの共通部品であれば車の親クラスで管理など)

確かに、同じソースコードが色々な個所に書かれているプログラムは、修正が大変なんだよな・・・

スポンサーリンク

以下は継承を使用した場合の例です。

[継承を利用した場合の例]

<?php

// 車の基本クラス
class BaseCar 
{
    const MANUFACTURER = "○○自動車";

    public function printCar($price) {
        print("製造元は".self::MANUFACTURER."<br />");
        print("販売価格は$price 円<br />");
    }
}

// 新車クラス
class NewCar extends BaseCar 
{
    public function printNewCar($price) {
        print("新車です<br />");
        $this->printCar($price);
    }
}

// 中古クラス
class OldCar extends BaseCar 
{
    public function printOldCar($price) {
        print("中古車です<br />");
        $this->printCar($price);
    }
}

?>

上記例では、「新車クラス」と「中古クラス」は「車の基本クラス」を継承しています。

継承を使うことで、車の共通的な機能は親クラスで管理し、子クラスでは、子クラス独自の機能を実装するだけです。

継承を利用することで、何度も同じソースコードを書かずに済み、読みやすいソースコードを書くことができます。

ただし、継承もやりすぎると"保守性"や"可読性"が悪くなる場合もあるので、しっかりと検討したうえで継承を使うことが大切です。

オーバーライド

オーバーライドとは、継承元である親クラスで定義されているメソッドを、子クラスで書き換えることです。

親クラスにあるメソッドと、同じ名前、同じ引数のメソッドを子クラスに記述することでオーバーライドすることができます。

オーバーライドの使用例

それでは、実際にPHPのプログラムでオーバーライドの使い方を紹介します。

次の例では、親クラスのメソッド「printItem」を子クラスでオーバーライドしています。

[オーバーライドの例]

<?php

// 親クラス
class BaseClass
{
    public function printItem() {
        print("親クラスです");
    }
}

// 子クラス
class ChildClass extends BaseClass 
{
    public function printItem() {
        print("子クラスです");
    }
}

$child = new ChildClass();
$child->printItem();

?>

[実行結果]

子クラスです

終わりに

本記事では、PHPの継承とオーバーライドについて紹介しました。

次回の記事では、HPのstaticプロパティとstaticメソッドについて紹介します。

helpful