• Skip to main content
  • Skip to primary sidebar

bloggggggggggggggg

// コードと趣味の境界線上

なんでも継承で解決しようとするな ― Composition over Inheritance をPHPで考える

「共通処理をまとめたい → 基底クラス作ろう」という思考、あるある。でもそれ、だいたい2年後に技術的負債になる。私も何度もやりかけては痛い目を見てきた。

継承は「is-a」関係。動物クラスを継承した犬クラス、猫クラス。一見きれい。でも犬は吠えるけど猫は吠えない——さてどこに bark() を置く?こういう小さな歪みが積み重なって、やがて継承ツリー全体が崩壊する。

Compositionの考え方

「has-a」関係。振る舞いを小さなクラスに切り出して、必要に応じて組み合わせる。

class Logger {
    public function log(string $msg): void {
        echo "[" . date("Y-m-d H:i:s") . "] $msg\n";
    }
}

class UserService {
    public function __construct(
        private Logger $logger,
        private Mailer $mailer
    ) {}
    
    public function register(User $user): void {
        $this->logger->log("Registering: {$user->email}");
        $this->mailer->sendWelcome($user);
    }
}

Traitは銀の弾丸か

PHPのTraitは一見compositionに見えるけど、実態はコンパイル時にコピペされるマクロ。多重Traitの衝突、可視性の問題、IDE追従の困難さ。乱用すると継承以上にカオスになる。

まとめ

「なんでも継承」から「小さなクラスを組み合わせる」への発想の転換が、長く生き残るコードを書く第一歩。PHP8.1のreadonlyプロパティやenumも、composition指向の設計と相性がいい。

← nginx高速化の底力 ― KUSANAGIを実戦投入してわかったこと
fishシェルに乗り換えて1年 ― もうbashには戻れない理由 →

Primary Sidebar

最近の投稿

  • 「動けばいい」のその先へ ― コードを書くということの再定義
  • fishシェルに乗り換えて1年 ― もうbashには戻れない理由
  • なんでも継承で解決しようとするな ― Composition over Inheritance をPHPで考える
  • nginx高速化の底力 ― KUSANAGIを実戦投入してわかったこと
  • こんちゃ

最近のコメント

  1. WordPress コメントの投稿者 on Hello world!

アーカイブ

  • May 2026

カテゴリー

  • サーバー・インフラ
  • ツール・環境
  • プログラミング
  • 未分類
  • 開発哲学

最近の投稿

  • 「動けばいい」のその先へ ― コードを書くということの再定義
  • fishシェルに乗り換えて1年 ― もうbashには戻れない理由
  • なんでも継承で解決しようとするな ― Composition over Inheritance をPHPで考える
  • nginx高速化の底力 ― KUSANAGIを実戦投入してわかったこと
  • こんちゃ

カテゴリ

  • サーバー・インフラ
  • ツール・環境
  • プログラミング
  • 未分類
  • 開発哲学

タグ

CLI fish KUSANAGI nginx PHP WordPress zsh アーキテクチャ エッセイ ターミナル パフォーマンス 生産性 設計 開発哲学