継承の基礎
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 21/91。
継承により、class は別の class からプロパティと method を取得できます。同じコードを書き直す代わりに、共有機能を備えた base class を作成し、他の class にそこから継承させることができます。
継承される parent class(またはベースクラス)は、継承元クラスと呼ばれ、継承するクラスは子クラスと呼ばれます。この関係を確立するには、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 ballDogクラスは、Animalから$nameプロパティ、コンストラクター、speak()メソッドに自動的にアクセスできます。また、犬だけが持つ独自のfetch()メソッドも定義します。
これにより明確な階層が作られます。すべての dog は動物なので、Dog が Animal から inherits するのは理にかなっています。子の class は parent からすべてを利用しながら、独自の特化した動作を追加できます。
重要なポイント: 継承はコードの再利用を促進し、class 間の論理的な関係を確立します。子クラスは parent からすべての public および保護されたメンバーを継承するため、重複が減り、コードの保守が容易になります。
チャレンジ
簡単継承によって、child class が parent class の機能を共有しながら独自の特化した動作を追加できることを示す、vehicle の階層システムを構築しましょう。
コードを3つのファイルに分けて整理します。
Vehicle.php:すべての vehicle の parent として機能するVehicleclass を Define します。public な$brandproperty と、brand を accepts して設定する constructor を持たせます。start()method は"[brand] is starting"を returns し、stop()method は"[brand] is stopping"を returns するようにします。Motorcycle.php:Vehicleを extends するMotorcycleclass を Define します。先頭で Vehicle ファイルを Include します。Motorcycleclass は parent の constructor を inherits するため、独自の constructor は必要ありません。wheelie()method を Add し、"[brand] is doing a wheelie!"を returns するようにします。これは motorcycle 独自の動作です。main.php:Motorcycle ファイルを Include します(このファイルはすでに Vehicle を Include しています)。1つの input、つまり motorcycle の brand を受け取ります。この brand でMotorcycleobject を Create します。start()、次にwheelie()、最後にstop()を呼び出した result を、それぞれ1行ずつ Print します。
Motorcycle class が、Vehicle から $brand property、constructor、そして start() と stop() の両方の method を自動的に inherits していることに注目してください。child class では、この場合は wheelie を行えることのように、自分独自の部分だけを Define すれば済みます。これが継承の力です。共通の機能を parent に一度だけ記述し、child class がそれを再利用しながら独自の特化機能を追加できるようにします。
自分で試してみよう
<?php
// Motorcycleクラスをインクルードする(すでにVehicleを含んでいる)
require_once 'Motorcycle.php';
// 入力を読み取る
$brand = trim(fgets(STDIN));
// TODO: brandでMotorcycleオブジェクトを作成する
// TODO: start()の結果を出力する
// TODO: wheelie()の結果を出力する
// TODO: stop()の結果を出力する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ