継承によるクラスの拡張
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 継承によるクラスの拡張
- 抽象クラスと抽象メソッド
- インターフェースの実装
- コード再利用のためのトレイト