Menu
Coddy logo textTech

継承の基本

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 21/91。

継承により、あるクラスが別のクラスからプロパティやメソッドを引き継ぐことができます。同じコードを何度も書き直す代わりに、共通の機能を持つベースクラスを作成し、他のクラスにそれを継承させることができます。

継承元のクラスは親クラス(またはベースクラス)と呼ばれ、継承する側のクラスは子クラスと呼ばれます。この関係を確立するには、extendsキーワードを使用します:

<?php
class Animal {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
    
    public function speak() {
        return "$this->name makes a sound";
    }
}

class Dog extends Animal {
    public function fetch() {
        return "$this->name fetches the ball";
    }
}

$dog = new Dog("Buddy");
echo $dog->speak() . "\n";
echo $dog->fetch();

出力:

Buddy makes a sound
Buddy fetches the ball

Dog クラスは、Animal から $name プロパティ、コンストラクタ、および speak() メソッドに自動的にアクセスできます。また、犬だけが持つ独自の fetch() メソッドも定義しています。

これにより、明確な階層構造が作成されます。すべての犬は動物であるため、DogAnimal から継承することは理にかなっています。子クラスは、独自の特化した動作を追加しながら、親クラスのすべてを使用できます。

重要なポイント: 継承はコードの再利用を促進し、クラス間の論理的な関係を確立します。子クラスは親からすべての public および protected メンバを継承するため、重複が減り、コードのメンテナンスが容易になります。

challenge icon

チャレンジ

簡単

継承によって、子クラスが親クラスの機能を共有しながら、独自の特化した動作を追加できることを示す車両階層システムを構築しましょう。

コードを3つのファイルに分けて構成します:

  • Vehicle.php — すべての車両の親となる Vehicle クラスを定義します。パブリックな $brand プロパティと、ブランドを受け取って設定するコンストラクタを持たせる必要があります。"[brand] is starting" を返す start() メソッドと、"[brand] is stopping" を返す stop() メソッドを含めてください。
  • Motorcycle.phpVehicle を継承する Motorcycle クラスを定義します。ファイルの先頭で Vehicle ファイルをインクルードしてください。Motorcycle クラスは親のコンストラクタを継承するため、独自のコンストラクタは必要ありません。オートバイ特有の動作として、"[brand] is doing a wheelie!" を返す wheelie() メソッドを追加してください。
  • main.php — Motorcycle ファイル(すでに Vehicle をインクルードしています)をインクルードします。1つの入力としてオートバイのブランドを受け取ります。このブランドを使用して Motorcycle オブジェクトを作成してください。start()、次に wheelie()、最後に stop() を呼び出した結果を、それぞれ個別の行に出力してください。

Motorcycle クラスが、Vehicle から $brand プロパティ、コンストラクタ、そして start()stop() メソッドの両方を自動的に継承していることに注目してください。子クラスは、自分自身をユニークにするもの(この場合はウィリーをする能力)を定義するだけで済みます。これが継承の力です。共通の機能を親クラスに一度記述すれば、子クラスは独自の特化機能を追加しながら、その機能を再利用できるのです。

自分で試してみよう

<?php
// Motorcycle クラスをインクルードする (これには Vehicle も含まれています)
require_once 'Motorcycle.php';

// 入力を読み込む
$brand = trim(fgets(STDIN));

// TODO: brand を使用して Motorcycle オブジェクトを作成する

// TODO: start() の結果を出力する

// TODO: wheelie() の結果を出力する

// TODO: stop() の結果を出力する
?>
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン