parent:: キーワード
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 22/91。
子クラスが親クラスから継承する場合、親クラスのメソッドやプロパティに直接アクセスする必要があることがあります。parent:: キーワードを使用すると、子クラス内から親クラスの実装を呼び出すことができます。
これは、子が自身のプロパティを設定しながら親のプロパティを初期化する必要があるコンストラクタにおいて、特に便利です。
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
public $breed;
public function __construct($name, $breed) {
parent::__construct($name);
$this->breed = $breed;
}
public function describe() {
return "$this->name is a $this->breed";
}
}
$dog = new Dog("Max", "Labrador");
echo $dog->describe();
出力:
Max is a Labradorparent::__construct($name)を呼び出すことで、子クラスは親クラスの初期化ロジックを重複させることなく再利用します。この呼び出しがないと、$nameプロパティは決して設定されません。
parent:: を使用すると、コンストラクタだけでなく、任意の親メソッドを呼び出すことができます。これは、メソッドの動作を完全に置き換えるのではなく、拡張したい場合に特に重要になります。
重要なポイント: parent:: キーワードは、親クラスの実装にアクセスする方法を提供します。これは、適切なコンストラクタチェーンを実現し、機能を書き直すのではなく継承された機能を基に構築するために不可欠です。
チャレンジ
簡単子クラスが parent:: キーワードを使用してコンストラクタを適切に連鎖させ、継承されたメソッドを拡張する方法を示す製品カタログシステムを構築しましょう。
コードは以下の3つのファイルに分けて構成します:
Product.php— すべての製品のベースとなるProductクラスを定義します。このクラスには、パブリックプロパティ$nameと$priceを持たせる必要があります。コンストラクタは名前と価格を受け取り、両方のプロパティを設定します。"[name]: $[price]"を返すgetDetails()メソッドを含めてください。ElectronicProduct.php—Productを継承するElectronicProductクラスを定義します。ファイルの先頭で Product ファイルをインクルードしてください。このクラスには$warrantyプロパティ(月単位)を追加します。コンストラクタは名前、価格、保証期間を受け取る必要があります。parent::__construct()を使用して親クラス経由で名前と価格を初期化し、その後、自身で保証期間を設定します。親のメソッドの実装を拡張するgetDetails()メソッドを作成します。parent::getDetails()を呼び出し、その後に" (Warranty: [warranty] months)"を追加してください。main.php— ElectronicProduct ファイルをインクルードします。3つの入力(製品名、価格(浮動小数点数に変換する文字列)、保証期間(整数に変換する文字列))を受け取ります。これらの値を使用してElectronicProductインスタンスを作成し、getDetails()を呼び出した結果を出力してください。
このチャレンジは、コンストラクタの連鎖だけでなく、メソッドの振る舞いを拡張するための parent:: の真の力を示しています。ElectronicProduct は親のフォーマットロジックを再利用し、その上に独自の詳細を追加することで、コードの重複を避けながら、より豊かな出力を生成します。
チートシート
parent:: キーワードを使用すると、子クラスから親クラスのメソッドやプロパティにアクセスできます。
子クラスから親のコンストラクタを呼び出すには、parent::__construct() を使用します。
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
public $breed;
public function __construct($name, $breed) {
parent::__construct($name);
$this->breed = $breed;
}
}
また、parent:: を使用して親のメソッドを呼び出し、その動作を拡張することもできます。
<?php
class Animal {
public function describe() {
return "This is an animal";
}
}
class Dog extends Animal {
public function describe() {
return parent::describe() . " and it's a dog";
}
}
このアプローチにより、子クラスはコードを重複させることなく親のロジックを再利用でき、適切なコンストラクタチェーンやメソッドの拡張が可能になります。
自分で試してみよう
<?php
require_once 'ElectronicProduct.php';
// 入力を読み込む
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$warranty = intval(trim(fgets(STDIN)));
// TODO: 入力値を使用してElectronicProductを作成し、
// getDetails()を呼び出した結果を出力する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。