hello foo bar Saba note | PHPのtrait(トレイト)

PHPのtrait(トレイト)

2017.7.7 (金)

Class継承に問題ありのPHPがtraitのおかげでいろいろ便利になりました。メソッドとプロパティが何度でも使いまわせるというやつです。ちょっと腑に落ちないのはtrait自身のインスタンスは作れないというところですかね。常にClassからuseするかたちでのみメソッドとプロパティが使えるということになります。

トレイト実装

testTrait.phpを作成します。

<?php
// testTrait.php
trait testTrait {
    public function foo() {
        return "testTrait foo()";
    }
}

Classと全く同じように作ればいいです。これをClassでuseします。
(ものホンのフレームワークとかだったらincludeとかじゃなくてuseで名前空間を指定している感じになります。)

<?php
// testClass.php
include "testTrait.php";

class testClass {
    use testTrait;

    // traieのfoo()をオーバーライド
    public function foo() {
        return "Overraide foo();";
    }
}

Classの中ではtraitにあるメソッドやプロパティーを再利用しつつオーバーラードすることができます。

<?php
// index.php
include "./testClass.php";

$o = new testClass();
echo $o->foo();

実行結果は、

Overraide foo();

となって、上書きで実行した方のリターンが返ってくることがわかります。

まとめ

  • traitにあるもので使えるものはそのまま使う。
  • traitにあるもので変更を加えたいものに関してはオーバーライドして使う。
  • traitにないものはクラスの中で書き足す。

みたいな運用方法になるかと思います。いずれにしろtraitは非常に抽象度の高いものを入れておく器みたいな扱いになると思います。複数のクラスで何度も使うものはtraitにしておくのが吉。
あるいは、traitに具材をいれてclassで料理という感じでしょうか。


PHP マニュアル トレイト