この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:atom
更新日時:2026-05-17 06:28:42

タイトル: ポリモーフィズム(多様性)の具体例

PHPのポリモーフィズム(多様性)の具体例を記載する記事です。同じインターフェース/メソッド名を持つ複数のクラスを、共通の型として扱える性質のことです。

ポリモーフィズムとは

同じ名前のメソッドが、呼び出すオブジェクトの型によって異なる振る舞いをする性質をポリモーフィズムと呼びます。継承やインターフェース実装によって実現します。

これにより、呼び出し側は具体的な型を意識せず共通の処理として書け、新しい型を追加するときも既存コードを変更しなくて済みます。

具体例1: インターフェースで揃える

「鳴く」動作を持つ動物クラスを、同じインターフェースで扱う例。

interface Animal {
    public function cry(): string;
}

class Dog implements Animal {
    public function cry(): string { return "ワン"; }
}

class Cat implements Animal {
    public function cry(): string { return "ニャー"; }
}

class Cow implements Animal {
    public function cry(): string { return "モー"; }
}

function letItCry(Animal $animal): void {
    echo $animal->cry() . "\n";
}

letItCry(new Dog());  // ワン
letItCry(new Cat());  // ニャー
letItCry(new Cow());  // モー

letItCry() は具体的なクラスを知らず、Animal インターフェースとして扱っています。新しい動物クラス(例: Sheep)を追加しても、letItCry() 側の修正は不要です。

具体例2: 抽象クラスを継承する

共通処理を抽象クラスに置き、個別の振る舞いをサブクラスで実装する例。

abstract class Shape {
    abstract public function area(): float;

    public function describe(): string {
        return "面積は" . $this->area() . "です";
    }
}

class Circle extends Shape {
    public function __construct(private float $r) {}
    public function area(): float { return $this->r * $this->r * M_PI; }
}

class Square extends Shape {
    public function __construct(private float $side) {}
    public function area(): float { return $this->side ** 2; }
}

$shapes = [new Circle(3), new Square(4)];
foreach ($shapes as $s) {
    echo $s->describe() . "\n";
}

具体例3: 支払い手段の切替

現実的なケース。支払い手段を増やしても呼び出し側のロジックを変えずに済む。

interface PaymentMethod {
    public function pay(int $amount): bool;
}

class CreditCardPayment implements PaymentMethod {
    public function pay(int $amount): bool { /* 決済処理 */ return true; }
}

class PayPayPayment implements PaymentMethod {
    public function pay(int $amount): bool { /* QR決済処理 */ return true; }
}

function checkout(PaymentMethod $payment, int $amount): void {
    if ($payment->pay($amount)) {
        echo "決済完了";
    }
}

ポリモーフィズムの利点

  • 拡張性: 新しい型を追加しても呼び出し側を変更しなくてよい(OCP: 開放/閉鎖原則)
  • テストしやすい: モックやスタブを差し込みやすい
  • 条件分岐の削減: if ($type === "dog") ... elseif ($type === "cat") ... といった分岐がメソッド呼び出しに置き換わる

関連

  • 親カテゴリ: 文法 (PHP)
  • 類似概念は他言語でも同じ: Javaのインターフェース、C#の interface など
  • Javaでのオーバーライド・オーバーロードも参考: オーバーライド