PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPのクラス継承とは?extendsの使い方とオーバーライドを徹底解説

はじめに

継承は、オブジェクト指向プログラミングにおける最も重要な原則のひとつです。継承を利用すると、2つのクラス間に「親」と「子」の関係を定義でき、コードの再利用性や保守性が大きく向上します。PHPのオブジェクトモデルもこの継承を正式にサポートしています。

PHPでは extends キーワードを使うことで、2つのクラス間に継承関係を構築します。

継承の基本構文

class B extends A

ここで A は基底クラス(親クラス)、B はサブクラス(子クラス)と呼ばれます。子クラスは、親クラスの public および protected メソッドを自動的に受け継ぎます。子クラス側で継承したメソッドを再定義(オーバーライド)することも可能です。オーバーライドしなかった場合、継承されたメソッドは親クラスで定義された通りの機能を保持し続けます。

注意点として、親クラスの定義は必ず子クラスの定義より前に記述する必要があります。つまり、この例ではスクリプト内で A クラスの定義が B クラスの定義よりも先に現れなければなりません。

基本形のコード例

<?php
class A{
    // クラスAのプロパティ・定数・メソッド
}
class B extends A{
    // public および protected メソッドが継承される
}
?>

オートロードが有効になっている環境では、親クラスの定義は対応するクラスファイルを読み込むことで自動的に取得されます。

継承の実例:可視性と継承の関係

次のコードは、子クラスが親クラスの public および protected メンバーを継承する一方、private メンバーは継承されないことを示しています。

<?php
class parentclass{
    public function publicmethod(){
        echo "This is public method of parent class\n";
    }
    protected function protectedmethod(){
        echo "This is protected method of parent class\n";
    }
    private function privatemethod(){
        echo "This is private method of parent class\n";
    }
}
class childclass extends parentclass{
    public function childmethod(){
        $this->protectedmethod();
        //$this->privatemethod(); // 呼び出すとエラーになる
    }
}
$obj = new childclass();
$obj->publicmethod();
$obj->childmethod();
?>

実行結果

上記のコードを実行すると、次の出力が得られます。

This is public method of parent class
This is protected method of parent class
PHP Fatal error: Uncaught Error: Call to private method parentclass::privatemethod() from context 'childclass'

private メソッドは子クラスからアクセスできないため、呼び出した時点で致命的なエラー(Fatal error)が発生します。

メソッドのオーバーライド

親クラスから継承したメソッドを子クラスで再定義すると、新しい定義が元の機能を上書きします。これを「オーバーライド」と呼びます。次の例では、publicmethod を子クラス側で再度定義しています。

<?php
class parentclass{
    public function publicmethod(){
        echo "This is public method of parent class\n";
    }
    protected function protectedmethod(){
        echo "This is protected method of parent class\n";
    }
    private function privatemethod(){
        echo "This is private method of parent class\n";
    }
}
class childclass extends parentclass{
    public function publicmethod(){
        echo "public method of parent class is overridden in child class\n";
    }
}
$obj = new childclass();
$obj->publicmethod();
?>

実行結果

子クラス側の定義が優先されるため、出力は次のようになります。

public method of parent class is overridden in child class

補足:parent:: で親クラスのメソッドを呼び出す

メソッドをオーバーライドした場合でも、「parent::メソッド名()」と書けば子クラスから親クラスの元の実装を呼び出せます。親の処理を活かしつつ、子クラス独自の追加処理を行いたい場合に非常によく使われるテクニックなので、あわせて覚えておくと便利です。

階層的継承(多重継承との違い)

PHPは多重継承をサポートしていません。そのため、1つのクラスが2つ以上のクラスを同時に extends することはできません。しかし、次のように「あるクラスが別のクラスを継承し、さらにそれを第三のクラスが継承する」という階層的な継承(継承チェーン)であれば問題なく実現できます。

<?php
class A{
    function test(){
        echo "method in A class";
    }
}
class B extends A{
    //
}
class C extends B{
    //
}
$obj = new C();
$obj->test();
?>

実行結果

C クラスのインスタンスは、親(B)を経由して祖父にあたる A クラスのメソッドまで辿って呼び出すことができます。

method in A class

まとめ

PHPの継承は extends キーワードによって実現され、public と protected メンバーが子クラスへ引き継がれる一方、private メンバーは継承の対象外となります。継承したメソッドは自由にオーバーライドでき、parent:: を使えば親の実装も呼び出せます。多重継承はサポートされていませんが、階層的な継承チェーンなら柔軟に構築可能です。これらの特性を正しく理解することが、堅牢なオブジェクト指向設計への第一歩となります。

  1. C#のObjectクラスとは?全クラスの基底クラスと主要メソッドを徹底解説

    C#におけるObjectクラスは、すべてのクラスの継承階層において最も上位に位置する基底クラス(ルートクラス)です。C#で定義されるあらゆる型は、明示的に指定しなくても自動的にObjectクラスを継承しており、そのためすべてのオブジェクトはObjectクラスが提供するメソッドを利用できます。Objectクラスの主なメソッド一覧Objectクラスには、以下のような重要なメソッドが用意されています。番号メソッドと説明1Equals(Object)指定されたオブジェクトが、現在のオブジェクトと等しいかどうかを判定します。2Equals(Object, Object)指定された2つのオブジェクトインス

  2. C#のStackクラスとは?主なプロパティとメソッドを徹底解説

    Stackクラスとは C#のStackクラスは、後入れ先出し(LIFO:Last-In, First-Out)という仕組みでオブジェクトを管理するコレクションです。スタックでは、最後に追加した要素が最初に取り出されるため、「直近に追加したデータから順番に処理したい」という場面で活用されます。 例えば、操作履歴の「元に戻す(Undo)」機能や、再帰的な処理の一時保存など、LIFO構造が自然にマッチするケースでよく使われています。 Stackクラスの主なプロパティ Count ― スタックに格納されている要素の数を取得します。 Stackクラスの主なメソッド一覧 Stackクラスには、要素