0Pricing
PHP Academy · レッスン

継承によるクラスの拡張

extendsを使ってクラス階層を構築し、メソッドをオーバーライドします

「継承によるクラスの拡張」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。

はじめに:PHPの継承

継承を使うと、クラス(子クラス)がextendsキーワードによって別のクラス(親クラス)のコードを再利用し、拡張できます。PHPは単一継承をサポートしています。

重要な概念

重要な概念:

  • 子クラスはすべてのpublicメンバーとprotectedメンバーを継承します
  • 親クラスのメソッドをオーバーライドして動作を変更します
  • parent::で親クラスのメソッドを呼び出します
  • finalを使ってオーバーライドを禁止します

基本的なextends

例:

<?php
class Shape {
    public function __construct(protected string $color) {}
    public function describe(): string { return "A {$this->color} shape"; }
}

class Circle extends Shape {
    public function __construct(string $color, private float $radius) {
        parent::__construct($color);
    }
    public function area(): float { return M_PI * $this->radius ** 2; }
}

$c = new Circle('red', 5);
echo $c->describe();   // A red shape
echo round($c->area()); // 79

メソッドのオーバーライド

続き:

<?php
class Logger {
    public function log(string $msg): void {
        echo "[LOG] $msg" . PHP_EOL;
    }
}

class DatabaseLogger extends Logger {
    public function log(string $msg): void {
        // Extend parent behavior
        parent::log($msg);
        // Also save to DB
        echo "[DB] Saved: $msg" . PHP_EOL;
    }
}

$l = new DatabaseLogger();
$l->log('User login');

finalキーワード

さらに詳しく:

<?php
class PaymentProcessor {
    final public function processPayment(float $amount): void {
        // Critical logic — cannot be overridden
        $this->validate($amount);
        $this->charge($amount);
        $this->log($amount);
    }

    protected function validate(float $amount): void { /* ... */ }
    protected function charge(float $amount): void   { /* ... */ }
    protected function log(float $amount): void      { /* ... */ }
}

instanceofによるチェック

実践的な使い方:

<?php
class Vehicle {}
class Car extends Vehicle {}
class ElectricCar extends Car {}

$ev = new ElectricCar();

var_dump($ev instanceof ElectricCar); // true
var_dump($ev instanceof Car);         // true
var_dump($ev instanceof Vehicle);     // true

// Also works with interfaces
var_dump($ev instanceof Countable);   // false

抽象基底クラス

応用:

<?php
abstract class Notification {
    abstract public function send(string $message): bool;

    public function sendBatch(array $messages): void {
        foreach ($messages as $msg) {
            $this->send($msg);
        }
    }
}

class EmailNotification extends Notification {
    public function send(string $message): bool {
        echo "Email: $message" . PHP_EOL;
        return true;
    }
}

パターン

PHPの継承では、繰り返し現れる設計上の問題をきれいに解決するため、一般的なパターンが使用されます。読みやすく保守しやすいコードになるよう、一貫して適用してください。

使用する場面

PHPの継承をいつ適用するかを知ることは、適用方法を知ることと同じくらい重要です。過剰に使用すると複雑になり、使用しなさすぎるとコードが重複します。

実際の使用例

実際のアプリケーションでは、PHPの継承はフレームワーク、ORM、サービス層で頻繁に登場します。継承を理解することで、プロフェッショナルなPHPプロジェクトに貢献するための準備が整います。

よくある落とし穴

PHPの継承では、次のような間違いを避けてください:

  • 親クラスの状態を初期化するため、必ずparent::__construct()を呼び出します
  • 変更を加えずに親クラスを呼び出すだけなら、メソッドをオーバーライドしないでください
  • セキュリティ上重要なメソッドにはfinalを使用します
  • 深い継承階層よりもコンポジションを優先します

クイックチェック

サブクラスでメソッドがオーバーライドされるのを防ぐキーワードは何ですか?

復習:PHPの継承

まとめ:

  • 親クラスの状態を初期化するため、必ずparent::__construct()を呼び出します
  • 変更を加えずに親クラスを呼び出すだけなら、メソッドをオーバーライドしないでください
  • セキュリティ上重要なメソッドにはfinalを使用します
  • 深い継承階層よりもコンポジションを優先します

よくある質問

「継承によるクラスの拡張」レッスンは無料ですか?

はい。「継承によるクラスの拡張」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。

「継承によるクラスの拡張」で何を学びますか?

extendsを使ってクラス階層を構築し、メソッドをオーバーライドします ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

PHP Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「継承によるクラスの拡張」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPHP Academyレッスンでコードを書いて実行できますか?

はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 継承によるクラスの拡張
  2. 抽象クラスと抽象メソッド
  3. インターフェースの実装
  4. コード再利用のためのトレイト
← PHP Academyに戻る