PHPのトレイト(trait)とは?コードの再利用を実現する仕組みを解説
PHPのオブジェクト指向プログラミングでは、トレイト(trait)を使うことで、複数のクラス間で共通のメソッドを再利用することができます。
継承とは異なり、トレイトは「部分的な機能の使い回し」を目的とした柔軟な仕組みです。
トレイトの基本構文
trait トレイト名 {
public function メソッド名() {
// 処理内容
}
}
例:
trait Logger {
public function log($message) {
echo "[LOG] " . $message;
}
}
クラスでトレイトを使用する
use
キーワードを使って、クラス内でトレイトを取り込みます。
class User {
use Logger;
public function create() {
$this->log("ユーザー作成");
}
}
$user = new User();
$user->create(); // [LOG] ユーザー作成
複数のトレイトを同時に使う
trait A {
public function methodA() {
echo "Aの機能";
}
}
trait B {
public function methodB() {
echo "Bの機能";
}
}
class Sample {
use A, B;
}
$obj = new Sample();
$obj->methodA(); // Aの機能
$obj->methodB(); // Bの機能
トレイトと継承の違い
比較項目 |
トレイト |
クラス継承 |
目的 |
機能の共有 |
全体の拡張 |
使用数 |
複数のトレイトを使用可 |
継承は1つまで |
使い方 |
use キーワード |
extends キーワード |
メソッドの競合と解決
同じ名前のメソッドを複数のトレイトが持っている場合、insteadof
や as
を使って解決できます。
trait A {
public function hello() {
echo "A";
}
}
trait B {
public function hello() {
echo "B";
}
}
class Sample {
use A, B {
B::hello insteadof A;
A::hello as helloFromA;
}
}
$obj = new Sample();
$obj->hello(); // B
$obj->helloFromA(); // A
まとめ
- トレイトは複数のクラスで共通の機能を再利用する仕組み
use
を使ってクラスに取り込む
- 継承と異なり、複数のトレイトを同時に使用できる
- メソッドの競合は
insteadof
や as
で解決可能
トレイトを使うことで、クラス間で重複するコードを効率よくまとめることができます。
よく使う共通処理が複数のクラスに必要なときは、ぜひトレイトの活用を検討してみましょう。