こんにちは。新卒2年目エンジニアの遠藤です。
今回はTraitを使用したのでその使用方法を例とともに紹介させていただきます。
Traitとは
- PHP5.4以降で導入されたコードを再利用するための仕組み。
- いくつかのメソッド群を異なるクラス階層にある独立したクラスで再利用可能。
- いくつかの機能をまとめるためのものであり、インスタンスを作成することはできない。
実際に使用した例
Traitの使用用途はいくつかありますが、今回は以下の2つの理由で使用しました。
- 機能をいくつかのクラスで使い回したかった。
- 機能をグルーピングして見やすくしたかった。
Mail.php
メール機能をTraitにグルーピングしてまとめました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php namespace App\Http\Trait; trait Mail { private function joinMail { ・・・// 入会完了メール送信 } private function payMail { ・・・// 支払い完了メール送信 } private function errorMail { ・・・// エラー発生メール送信 } } |
firstController.php
最初にuseを使用してTraitを呼び出しておけば、任意の箇所で$this->とすれば、Trait内のメソッドが使えるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php namespace App\Http\Controllers; class firstController extends Controller { use \App\Http\Trait\Mail; ・・・// その他の処理 $this->joinMail(); // 入会完了メールが送信される ・・・// その他の処理 } |
secondController.php
別のクラスでも使用できました。どちらもControllerを継承しているからControllerに書いておけばと思いがちですが、Traitを使用することで機能のまとまりがわかりやすくなり、Controllerが複雑になるのも避けることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php namespace App\Http\Controllers; class secondController extends Controller { use \App\Http\Trait\Mail; ・・・// その他の処理 $this->joinMail(); // 入会完了メールが送信される ・・・// その他の処理 } |
異なる独立したクラス階層での使用
最後に異なるクラス階層での使用ができるとのことなので記載します。
以下のfirstControllerとsecondControllerのように継承元が異なる2つのクラスが存在する場合は、どちらもControllerから継承するような場合と違い、継承元に書いておけば使い回せるというのが通用しません。
ここで、Traitにまとめておくとuseで呼び出すだけで使えます。単一継承言語におけるコードの再利用問題を解決してくれるという感じです。
firstController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php namespace App\Http\Controllers; class firstController extends oneController { use \App\Http\Trait\Mail; ・・・// その他の処理 $this->joinMail(); // 入会完了メールが送信される ・・・// その他の処理 } |
secondController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App\Http\Controllers; class secondController extends twoController { use \App\Http\Trait\Mail; ・・・// その他の処理 $this->joinMail(); // 入会完了メールが送信される ・・・// その他の処理 } |