はじめに
PHPで共通処理を複数のクラスに持たせたいとき、インターフェースを抽象クラスで実装すること以外に、traitを使うということを学んだ。
この記事では、その理解の過程を整理する。
traitは「処理の再利用」のための道具
- 抽象クラス → 「共通の型・構造をもつクラスを継承させる」ためのもの
- trait → 「特定の処理だけを、クラスに柔軟に注入する」ためのもの
共通のインターフェースやプロパティをもたせたいなら抽象クラス
単に関数の中身を再利用したいだけなら traitがベスト
インターフェース+抽象クラス と trait の違い
たとえば、
- 複数のクラスで
render()
メソッドを使いたい - 全部同じ実装になる
- それなら、interface + 抽象クラスで共通実装を提供すればよさそう
これで「共通実装」も「共通の型」も成立する。
でも抽象クラスには制限がある。
それは、PHPはクラスの多重継承ができない。
class A extends B, C // ❌ 不可能
つまり、共通処理をいくつも継承させることはできない。
そこで、trait の出番。
trait は一つのクラスに複数入れ混むことができる。
trait を使うべき場面は?
- 共通処理を複数のクラスに持たせたい。
- 共通の状態や型(プロパティ・親クラス)は不要。
- オーバーライドもしない。
- 必要があれば複数の共通処理を組み合わせたい
→ これらを満たすのが trait の強み
おわりに
インターフェースを抽象クラスで実装することの限界を理解した。
でも、trait を使えば、その限界を突破できる。