parent:: キーワード
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 22/91。
子 class が parent から継承すると、parent の method や properties に直接アクセスする必要が生じることがあります。parent:: キーワードを使うと、子 class 内から parent class の実装を呼び出せます。
これは特に constructor で、子クラスが自身の設定も行いながら parent の properties を初期化する必要がある場合に便利です:
<?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 property は決して設定されません。
コンストラクターだけでなく、任意の親メソッドを呼び出すには parent:: を使用できます。これは、メソッドを完全に置き換えるのではなく、その動作を拡張したい場合に特に重要になります。
重要なポイント: parent:: キーワードを使用すると、parent クラスの実装にアクセスできます。これは、適切なコンストラクターのチェーンや、継承した機能を書き直すのではなく、その上に機能を構築するために不可欠です。
チャレンジ
簡単parent::キーワードを使用してコンストラクターを適切にチェーンし、継承したメソッドを基に機能を構築することで、子クラスが親クラスの機能を拡張できる方法を示す製品カタログシステムを作成しましょう。
コードを3つのファイルに分けて整理します。
Product.php:すべての製品の base となるProductclass を Define します。$nameと$priceの public properties を持たせます。constructor は name と price を accepts し、両方の properties に設定します。"[name]: $[price]"をReturnsするgetDetails()method も含めます。ElectronicProduct.php:ProductをextendsするElectronicProductclassをDefineします。先頭でProduct fileをincludeします。このclassでは、$warrantyproperty(months単位)を追加します。constructorはname、price、warrantyをacceptsし、parentを通してnameとpriceをinitializeするためにparent::__construct()を使用し、その後でwarrantyをyourself設定します。parentの実装を基に構築するgetDetails()methodをCreateします。parent::getDetails()をcallingし、" (Warranty: [warranty] months)"を追加します。main.php:ElectronicProduct fileをincludeします。3つのinputsを受け取ります:product name、price(floatに変換するstring)、そしてwarranty period(integerに変換するstring)です。これらのvaluesを使ってElectronicProductをCreateし、getDetails()をcallingしたresultをprintします。
このchallengeは、parent::の本当の力を示します。constructorのチェーンだけでなく、methodの動作を拡張するためにも使用できます。ElectronicProductはparentのフォーマット処理を再利用し、その上に独自のdetailsを追加します。これにより、コードの重複を避けながら、より豊かな出力を作成できます。
自分で試してみよう
<?php
require_once 'ElectronicProduct.php';
// 入力を読み取る
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$warranty = intval(trim(fgets(STDIN)));
// TODO: 入力値で ElectronicProduct を作成する
// そして getDetails() を呼び出した結果を出力する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ