PHP - 継承: 基礎のガイド

こんにちは、未来のPHP魔法使いさんたち!今日は、PHPの継承の世界に一緒に飛び込んでみましょう。プログラミングが初めてでも心配しないでください - 私があなたの親切なガイドとして、すべてをステップバイステップで説明します。コーヒー(またはあなたが好きなお茶)を一杯取り、一緒に深く掘り下げてみましょう!

PHP - Inheritance

継承とは?

継承は、PHPのクラスの家系図のようなものです。あなたが祖母の目や父親のユーモアを受け継ぐのと同じように、プログラミングでは、クラスが他のクラスからプロパティやメソッドを受け継ぐことができます。この概念は、より整理された使いやすいコードを書く助けになります。

こう考えると簡単です:あなたが異なる種類のキャラクターを持つゲームを作成しているとします。すべてのキャラクターは基本的な特徴(名前やHPなど)を共有しているかもしれませんが、それぞれのキャラクター(戦士や魔術師など)にはユニークな能力があります。継承により、これらの共通の特徴をベースクラスで定義し、特定のキャラクタークラスを作成してこれらの特徴を受け継ぎ、独自の特徴を追加することができます。

基本的な継承の例

継承がPHPでどのように動作するかを簡単な例で見てみましょう。

class Animal {
public $name;

public function __construct($name) {
$this->name = $name;
}

public function speak() {
echo "The animal makes a sound.";
}
}

class Dog extends Animal {
public function speak() {
echo $this->name . " barks: Woof woof!";
}
}

$myDog = new Dog("Buddy");
$myDog->speak(); // 出力: Buddy barks: Woof woof!

この例では、2つのクラスがあります:AnimalDogDogクラスはAnimalクラスを継承しており、それによりAnimalのすべてのプロパティとメソッドを受け継ぎます。

以下に分解します:

  1. ベースのAnimalクラスを定義し、$nameプロパティとspeak()メソッドを持ちます。
  2. DogクラスをAnimalクラスを継承して作成し、extendsキーワードを使用します。
  3. Dogクラスはspeak()メソッドをオーバーライドして独自の実装を提供します。
  4. 新しいDogオブジェクト「Buddy」を作成し、そのspeak()メソッドを呼び出します。

DogクラスはAnimalから$nameプロパティを受け継ぎますが、独自のspeak()メソッドを提供します。これをメソッドオーバーライドと呼び、継承の強力な機能です。

継承とアクセス修飾子

次に、異なるアクセス修飾子(public、protected、private)と継承がどのように動作するかについて話しましょう。

class Vehicle {
public $brand;
protected $model;
private $serialNumber;

public function __construct($brand, $model, $serialNumber) {
$this->brand = $brand;
$this->model = $model;
$this->serialNumber = $serialNumber;
}

public function getInfo() {
return "Brand: " . $this->brand . ", Model: " . $this->model;
}

protected function getSerialNumber() {
return $this->serialNumber;
}
}

class Car extends Vehicle {
public $doors;

public function __construct($brand, $model, $serialNumber, $doors) {
parent::__construct($brand, $model, $serialNumber);
$this->doors = $doors;
}

public function getFullInfo() {
return $this->getInfo() . ", Doors: " . $this->doors . ", SN: " . $this->getSerialNumber();
}
}

$myCar = new Car("Toyota", "Corolla", "ABC123", 4);
echo $myCar->getFullInfo();
// 出力: Brand: Toyota, Model: Corolla, Doors: 4, SN: ABC123

この例では:

  1. Vehicleクラスには異なるアクセス修飾子を持つプロパティがあります。
  2. CarクラスはVehicleを継承し、独自のプロパティ($doors)を追加します。
  3. Carクラスはpublicとprotectedメンバーにアクセスできますが、privateメンバーにはアクセスできません。
  4. parent::__construct()を使用して親クラスのコンストラクタを呼び出します。

覚えておいてください:

  • Publicメンバーはどこからでもアクセスできます。
  • Protectedメンバーはクラスとそのサブクラスからアクセスできます。
  • Privateメンバーは定義されたクラス内でのみアクセスできます。

コンストラクタの継承

コンストラクタが継承でどのように動作するかを深く掘り下げましょう:

class Shape {
protected $color;

public function __construct($color) {
$this->color = $color;
echo "Shape constructor called.<br>";
}
}

class Circle extends Shape {
private $radius;

public function __construct($color, $radius) {
parent::__construct($color);
$this->radius = $radius;
echo "Circle constructor called.<br>";
}

public function getInfo() {
return "A {$this->color} circle with radius {$this->radius}";
}
}

$myCircle = new Circle("red", 5);
echo $myCircle->getInfo();

出力:

Shape constructor called.
Circle constructor called.
A red circle with radius 5

以下は何が起こっているかです:

  1. Circleオブジェクトを作成すると、PHPはまずShapeコンストラクタ(親クラス)を呼び出します。
  2. その後、Circleコンストラクタを呼び出します。
  3. parent::__construct($color)を使用してShapeコンストラクタを呼び出し、$colorプロパティを設定します。
  4. 最後に、$radiusプロパティをCircleクラスに固有のものとして設定します。

これにより、親クラスと子クラスの両方とも適切に初期化されます。

メソッド参照表

以下は、私たちの例で使用したメソッドの参照表です:

メソッド 説明
__construct() コンストラクタメソッド、オブジェクトが作成されたときに呼び出されます
speak() 動物が話すためのメソッド
getInfo() 車の基本情報を取得するメソッド
getSerialNumber() 車のシリアル番号を取得するprotectedメソッド
getFullInfo() 車の完全な情報を取得するメソッド

結論

継承は、PHPでクラスの階層を作成し、コードの再利用と整理を促進する強力なツールです。忘れないでください、レゴブロックで建てるのと同じように - ベースピースから始めて、より具体的なピースを積み重ねていきます。

PHPの旅を続ける中で、継承を使ったもっとエキサイティングな方法がたくさんあります。続けて練習を続けると、すぐに複雑で効率的なオブジェクト指向プログラムを簡単に作成できるようになります!

未来のPHPマスターさんたち、ハッピーコーディング! ??‍??‍?

Credits: Image by storyset