Lindelin

[特集]実はよく知らない PHP の新機能 その 3:Trait(トレイト)

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

なぜ Trait を利用するのか?

単一継承モデルを使用している PHP として、 まず、共通のルートクラス、基本的なメソッドを記述し、 このルートクラスを拡張し、より具体的なメソッドを作成するには、 直接的に親クラスの実装から継承されるのは一般的です。 それは、継承階層と呼ばれ、多くのプログラミング言語は、このモードを使用しています。 このような単一継承モデルは、多くの場面に対応できるが、2つ の無関係な PHP クラスを類似の挙動したい場合、どうすればいいですか?

そのため、Trait が誕生されました。Trait は、すでに実装されたモジュールを多数無関係な PHP クラスに注入することができます。 そうすると、コードの再利用性を高め、DRY(Don’t Repeat Yourself)原則が実現されます。

例えば、Laravel 基本となるユーザ認証関連のロジックや論理削除などの機能を実現するために Trait を使用しています。

Laravel Trait

Trait の宣言

Trait の宣言は非常に簡単です。Trait の宣言はクラスの宣言と同じです。ただし、使用する予約語は class ではなく、trait です。

<?php

namespace App\Tools\Checker;

use App\User;

trait AdminChecker
{
    /**
     * Super Admin Checker.
     * @param User $user
     * @return bool
     */
    protected function super_admin(User $user)
    {
        return
            $user->id === (int) config('admin.super_admin.id') and
            $user->name == config('admin.super_admin.name') and
            $user->email == config('admin.super_admin.email');
    }
}
?>

Trait の使用

Trait の使用も非常に簡単です。下記に示されている use 演算子によるインポートするだけです。 ただし、Trait クラスのインポートはクラス内で行います。

<?php

namespace App\Policies;

use App\User;
use App\Tools\Checker\AdminChecker;
use Illuminate\Auth\Access\HandlesAuthorization;

class AdminPolicy
{
    // Trait クラスのインポート
    use HandlesAuthorization, AdminChecker;

    /**
     * 管理者認証ポリシー.
     *
     * @param User $user
     * @return bool
     */
    public function is_super_admin(User $user)
    {
        if ($this->super_admin($user)) {
            return true;
        } else {
            return false;
        }
    }
}
?>

※本記事は『日本語ドキュメント作成スタイル基準規約』に基づいて作成されています


TOP