ch03 8章中 3章目

ch03 — 親メソッドを呼ぶ (parent::)

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch03 — 親メソッドを呼ぶ (parent::)」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch03 — 親メソッドを呼ぶ (parent::)」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch03 — 親メソッドを呼ぶ (parent::)」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

オーバーライドした子メソッドの中から 親の処理も走らせたい ときがある。例えば子の greet() で「親の挨拶を出した後に、子独自のメッセージを追加する」ような合成だ。このために PHP には parent::method() という記法があり、子のメソッド内から親クラスのメソッドを明示的に呼び出せる。parent::greet(); を実行すると、いま自分が動いているクラスの 親の同名メソッド が呼ばれる。

parent::「親を捨てずに拡張する」 ためのキーで、特に コンストラクタの連鎖 で重要になる。親クラスが __construct(string $name) で何かを初期化しているなら、子クラスのコンストラクタの最初の行で parent::__construct($name); を呼んでおかないと、親側の初期化が走らずプロパティが未初期化のまま残ってしまう。「子コンストラクタの先頭で parent::__construct() を呼ぶ」は実務で頻出する慣習になる。

$this->method()parent::method() の違いを区別しておく。$this->method() はオーバーライドを考慮して 実体のクラスのメソッド を呼ぶ (子で上書きされていれば子が走る)。parent::method() は明示的に 親のメソッド を呼ぶ。同じ名前で書ける場合でも、意図がまったく違うので使い分けに注意する。

学習目標

  • parent::method() で親クラスのメソッドを明示的に呼べる
  • オーバーライドした上で親の処理も走らせる「合成」ができる
  • 親の処理を捨てずに拡張する書き方を理解する

ドリル

no 内容
01 子クラスの greet()parent::greet() を呼んで合成する

解説スライド 全 6 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. 親メソッドを呼ぶ (parent::)

    Lesson 9 / Chapter 3

  2. オーバーライドすると、親の処理は消える

    <?php
    class Greeter {
        public function greet() {
            echo "こんにちは\n";
        }
    }
    
    class FormalGreeter extends Greeter {
        public function greet() {
            echo "本日はお世話になります\n";
        }
    }
    • 子で greet() を書くと、親の「こんにちは」は出ない
    • でも「親の挨拶 + 自分の追加」をしたいときがある
  3. parent::method() で親を呼べる

    <?php
    class FormalGreeter extends Greeter {
        public function greet() {
            parent::greet();   // 親の greet() を呼ぶ
            echo "本日はお世話になります\n";
        }
    }
    • parent:: は「親クラスの」という意味
    • parent::greet()親で定義された greet() を実行できる
  4. 子のインスタンスから呼んでみる

    <?php
    $g = new FormalGreeter();
    $g->greet();

    実行結果:

    こんにちは
    本日はお世話になります
    • 親の処理が先、その後に子の追加処理
    • 順番は自由 (子の処理 → 親、でも良い)
  5. 「親の処理を残しつつ拡張」する典型パターン

    <?php
    class Logger {
        public function log(string $msg) {
            echo "[LOG] $msg\n";
        }
    }
    
    class TimedLogger extends Logger {
        public function log(string $msg) {
            echo "[2026-05-18] ";
            parent::log($msg);   // 親の処理を再利用
        }
    }
    • 親の log を書き直さずに済む
    • 親が変わっても、自動的に追従する
  6. このチャプターでできるようになること

    parent::method() で親メソッドを呼べる ✅ オーバーライド + 親処理の合成ができる ✅ 親の処理を捨てずに拡張する書き方ができる

    → ドリルへ

1 / 6
📜 スライドを全部一気に読む(縦表示)

Lesson 9 / Chapter 3


オーバーライドすると、親の処理は消える

<?php
class Greeter {
    public function greet() {
        echo "こんにちは\n";
    }
}

class FormalGreeter extends Greeter {
    public function greet() {
        echo "本日はお世話になります\n";
    }
}
  • 子で greet() を書くと、親の「こんにちは」は出ない
  • でも「親の挨拶 + 自分の追加」をしたいときがある

parent::method() で親を呼べる

<?php
class FormalGreeter extends Greeter {
    public function greet() {
        parent::greet();   // 親の greet() を呼ぶ
        echo "本日はお世話になります\n";
    }
}
  • parent:: は「親クラスの」という意味
  • parent::greet()親で定義された greet() を実行できる

子のインスタンスから呼んでみる

<?php
$g = new FormalGreeter();
$g->greet();

実行結果:

こんにちは
本日はお世話になります
  • 親の処理が先、その後に子の追加処理
  • 順番は自由 (子の処理 → 親、でも良い)

「親の処理を残しつつ拡張」する典型パターン

<?php
class Logger {
    public function log(string $msg) {
        echo "[LOG] $msg\n";
    }
}

class TimedLogger extends Logger {
    public function log(string $msg) {
        echo "[2026-05-18] ";
        parent::log($msg);   // 親の処理を再利用
    }
}
  • 親の log を書き直さずに済む
  • 親が変わっても、自動的に追従する

このチャプターでできるようになること

parent::method() で親メソッドを呼べる ✅ オーバーライド + 親処理の合成ができる ✅ 親の処理を捨てずに拡張する書き方ができる

→ ドリルへ

この章で取り組む 演習問題の流れ (1ステップ)
  1. 01 ドリル 01 — parent::greet() を呼ぶ README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

ドリル 01 — parent::greet() を呼ぶ

問題

Greeter クラスを定義してください。

  • メソッド greet()"こんにちは" を 1 行出力する

Greeter を継承した FormalGreeter クラスを定義してください。

  • greet() をオーバーライドし、まず parent::greet() を呼んでから "本日はお世話になります" を 1 行出力する

FormalGreeter のインスタンスを作って greet() を呼んでください。

期待される出力:

こんにちは
本日はお世話になります

ヒント

  • parent::greet(); で親の処理を呼べる
  • その後に追加の echo を書く

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(1問)

  1. ドリル 01 — parent::greet() を呼ぶ

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます