PHP – トレイト – メソッドの汎化

概要

インターフェイスはクラスがメソッドを実装することを明示・保証するが、その実装はインプリメントしたクラスに託されている。

一方トレイトは、予めメソッドを具体に実装しておき、これを用いるクラス中でuse文によって導入される。

トレイトの使い方

定義

traitキーワードでトレイトを定義し、その中で具体のメソッドを定義する。

トレイトの実装

トレイトを導入するクラスで、useキーワードで導入するトレイトを宣言し、メソッドを呼び出す。

実装例

ベースになるコード

インターフェイスで例示したRPGキャラクターのコードを使う。

  • 基底クラスCharacterClass:名前を持ち武器攻撃のみできる
  • インターフェイスSpellcaster:呪文を唱えるメソッドspell()を宣言
  • Swordfighterクラス:CharacterClassを継承
  • Wizardクラス:CharacterClassを継承し、Spellcasterをインプリメント
  • Priestクラス:CharacterClassを継承し、Spellcasterをインプリメント

要件

  • SwordfighterPriestに、クリティカルアタックの機能を持たせる
  • クリティカルアタックはどのクラスにおいても共通の技

トレイトの追加

以下のトレイトを追加する。

トレイトの導入

SwardfighterクラスとPriestクラスでトレイトを導入する。

トレイトのメソッドの利用

クラスのインスタンスでトレイトのメソッドを呼び出す。

留意点

  • プロパティーも宣言・定義できる
  • トレイトを導入するクラスを意図した$thisを使える
  • インスタンスのクラスがトレイトを導入している場合、class_uses()メソッドで導入しているトレイト名を得られる

class_uses~実装しているトレイトの確認

たとえば上の実装例で、別のトレイトも加えてclass_uses()で内容を確認してみる。トレイト名をキー・値とする連想配列となっていることがわかる。

これまでの例で、各クラスのインスタンスを配列に入れて、クラスに応じた動作をさせる。

トレイトを実装しているかどうかのチェックは、class_uses()で導入しているトレイトの連想配列を得て、そのキーに対象となるトレイト名があるかどうかをarray_key_exists()でチェック。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です