抽象クラスと抽象メソッド
abstractキーワードを使って実装の一部を持つ基底クラスを定義します
「抽象クラスと抽象メソッド」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。
はじめに:抽象クラス
抽象クラスは直接インスタンス化できません。テンプレートとして機能します。抽象メソッドは実装なしでシグネチャを宣言し、サブクラスがその実装を提供します。
重要な概念
重要な概念:
abstract classを使って宣言します- 抽象メソッドには本体がありません:
abstract public function x(); - サブクラスはすべての抽象メソッドを実装する必要があります
- 抽象メソッドと具象メソッドの両方を含めることができます
抽象クラスの定義
例:
<?php
abstract class Animal {
public function __construct(protected string $name) {}
// Must be implemented by each subclass
abstract public function sound(): string;
// Shared concrete method
public function introduce(): string {
return "I am {$this->name} and I say: " . $this->sound();
}
}抽象メソッドの実装
続き:
<?php
class Dog extends Animal {
public function sound(): string { return 'Woof'; }
}
class Cat extends Animal {
public function sound(): string { return 'Meow'; }
}
$animals = [new Dog('Rex'), new Cat('Whiskers')];
foreach ($animals as $a) {
echo $a->introduce() . PHP_EOL;
}
// I am Rex and I say: Woof
// I am Whiskers and I say: Meowテンプレートメソッドパターン
さらに詳しく:
<?php
abstract class DataProcessor {
// Template method: defines the algorithm skeleton
final public function process(array $data): array {
$data = $this->validate($data);
$data = $this->transform($data);
return $this->format($data);
}
abstract protected function validate(array $data): array;
abstract protected function transform(array $data): array;
protected function format(array $data): array { return $data; }
}抽象クラスとインターフェースの比較
実践的な使い方:
<?php
// Use abstract class when:
// - Subclasses share implementation code
// - You need constructor logic or state
// Use interface when:
// - Defining a contract (no implementation needed)
// - Multiple inheritance of type is needed
// A class can only extend ONE abstract class
// but can implement MULTIPLE interfaces部分的な実装
応用:
<?php
abstract class Repository {
// Concrete method available to all subclasses
protected function findById(int $id, string $table): array {
$stmt = $this->getDb()->prepare("SELECT * FROM $table WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetch(PDO::FETCH_ASSOC) ?: [];
}
abstract protected function getDb(): PDO;
abstract public function find(int $id): array;
}パターン
抽象クラスでは、繰り返し現れる設計上の問題をきれいに解決するため、一般的なパターンが使用されます。読みやすく保守しやすいコードになるよう、一貫して適用してください。
使用する場面
抽象クラスをいつ適用するかを知ることは、適用方法を知ることと同じくらい重要です。過剰に使用すると複雑になり、使用しなさすぎるとコードが重複します。
実際の使用例
実際のアプリケーションでは、抽象クラスはフレームワーク、ORM、サービス層で頻繁に登場します。抽象クラスを理解することで、プロフェッショナルなPHPプロジェクトに貢献するための準備が整います。
よくある落とし穴
抽象クラスでは、次のような間違いを避けてください:
- 抽象クラスはnewでインスタンス化できません
- 具象サブクラスですべての抽象メソッドを実装する必要があります
- アルゴリズムの骨格を定義するには、テンプレートメソッドパターンを使用します
- 抽象クラスにはコンストラクタ、プロパティ、具象メソッドを含めることができます
クイックチェック
抽象クラスを「new」で直接インスタンス化できますか?
復習:抽象クラス
まとめ:
- 抽象クラスはnewでインスタンス化できません
- 具象サブクラスですべての抽象メソッドを実装する必要があります
- アルゴリズムの骨格を定義するには、テンプレートメソッドパターンを使用します
- 抽象クラスにはコンストラクタ、プロパティ、具象メソッドを含めることができます
よくある質問
「抽象クラスと抽象メソッド」レッスンは無料ですか?
はい。「抽象クラスと抽象メソッド」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。
「抽象クラスと抽象メソッド」で何を学びますか?
abstractキーワードを使って実装の一部を持つ基底クラスを定義します ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
PHP Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「抽象クラスと抽象メソッド」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPHP Academyレッスンでコードを書いて実行できますか?
はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 継承によるクラスの拡張
- 抽象クラスと抽象メソッド
- インターフェースの実装
- コード再利用のためのトレイト