PHP は OOP の継承と抽象化を 3 つの関連メカニズム、すなわち クラス継承 (extends)、抽象クラス (部分的なベースクラス)、および インターフェイス (契約) を通じてサポートしています。それぞれが異なる設計目的に役立ちます。
継承 — 親クラスを拡張する
{
{}
{ ; }
}
{
{ ; }
{
::() . ;
}
}
サブクラスは親を extends して、そのメンバーを継承し、オプションでオーバーライドできます。parent:: はオーバーライドされた親メソッドを呼び出します。PHP は 単一継承 (親は 1 つのみ) をサポートしています。
abstract class Shape {
abstract public function area(): float; // abstract — subclasses MUST implement
public function describe(): string { // concrete — shared implementation
return "Area: " . $this->area();
}
}
class Circle extends Shape {
public function __construct(private float $r) {}
public function area(): float { return 3.14159 * $this->r ** 2; } // must implement
}
// new Shape(); // ❌ error — abstract classes can't be instantiated
抽象クラス は、抽象メソッド (サブクラスが実装する必要あり) と具体的な共有コードを混在させます — 直接インスタンス化できないベースです。
interface Drawable {
public function draw(): void; // only signatures — no implementation
}
interface Serializable {
public function serialize(): string;
}
class Widget implements Drawable, Serializable { // implement MULTIPLE interfaces
public function draw(): void { /* ... */ }
public function serialize(): string { return "..."; }
}
インターフェイス は契約 (メソッドシグネチャ、実装なし) を定義します。クラスは 複数 のインターフェイスを implement できます — 単一継承の制限を回避する PHP の方法です。
extends (inheritance) → "is-a" relationship, reuse + override behavior
abstract class → a base with SHARED code + methods subclasses must implement (single)
interface → a CONTRACT/capability multiple unrelated classes can fulfill (multiple)
→ "Program to an interface" — depend on interfaces for flexible, testable designs.
継承、抽象クラス、インターフェイスはコア OOP ツールであり、これらの違いを理解することはよく構造化された PHP アプリケーションの設計に重要です (これらを大いに活用するフレームワークを扱う場合も同様です)。継承 (extends) は「is-a」関係を通じたコード再利用を提供しますが、PHP は単一継承のみを許可しています。抽象クラス は、実装されたコードとサブクラスが定義しなければならないメソッドの両方を持つ共有ベースを提供します — ロジックを共有する関連クラスに適しています。インターフェイス は契約/機能を定義し、重要なことに、クラスは 複数 のインターフェイスを実装できます — これが柔軟で疎結合な設計の鍵であり、単一継承の制限に対する PHP の答えです。
各メカニズムをいつ使うか (is-a 再利用に継承、共有の部分的実装に抽象クラス、契約/機能にインターフェイス)、および インターフェイスに対するプログラミング の原則 (テスト可能で柔軟でフレームワークに対応したコードのために抽象化に依存する) を知ることは、オブジェクト指向 PHP 設計において重要な知識です。
これらのメカニズムは Laravel や Symfony のようなフレームワークがそのコードを構造化する方法の基礎です (インターフェイスと抽象ベースクラスが至るところにあります)。自分のコードを良く設計すること、および構築するフレームワークを理解することの両方に不可欠です。