万能クラスや数珠つなぎの継承を作らずにコードの共有を行うトレイト

著者:杉浦

万能クラスや数珠つなぎの継承を作らずにコードの共有を行うトレイト

PHP: トレイト – Manual

トレイトは、PHP のような単一継承言語でコードを再利用するための仕組みのひとつです。 トレイトは、単一継承の制約を減らすために作られたもので、 いくつかのメソッド群を異なるクラス階層にある独立したクラスで再利用できるようにします。 トレイトとクラスを組み合わせた構文は複雑さを軽減させてくれ、 多重継承や Mixin に関連するありがちな問題を回避することもできます。

 トレイトはtraitと書き、次の様にclassと同じ書き方をし、useで読み込みます。関数などの名前が衝突した際にはinsteadofでどちらを使うか決定する、asで別名として扱う対応を行います。

<?php
trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
    public function moreBigTalk() {
        echo 'X';
    }
}

trait B {
    public function smallTalk() {
        echo 'b';
    }
    public function bigTalk() {
        echo 'B';
    }
}

class Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
    }
}

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
    $this->moreBigTalk();
}

 いまのところ使ったことはないですが可視性の変更も可能です。
 トレイトの特に強力で扱いやすい部分が名前の扱いです。トレイトなしでコードを再利用する場合、共通のクラスを継承する、ユーティリティクラスを作る、別ファイルにしてincludeかrequireしてグローバル領域に配置するといった手法が考えられます。それらの手法の複雑さの原因になりうるという危うい点を、継承を行わず、グローバルを汚染せず、区分をtraitの名前につけてコードの再利用を可能にすることでトレイトは回避しています。
 IDEは画像の様に内部に何が入っているのかアイコンで表示してくれるのでその点でもありがたいです。

  • この記事いいね! (0)

著者について

杉浦 administrator