トレイト
https://www.php.net/manual/ja/language.oop5.traits.php
PHPでは、コードを再利用する仕組みとして「トレイト」があります。
トレイトはクラスと同様に「プロパティ、メソッド」を書く事ができますが、トレイト自身をインスタンス化する事はできません。
PHP8より前のバージョンでは記述可能なアクセス権に制限がありましたが、PHP8以降は、すべてのアクセス権、抽象化されたメソッド、staticのすべてを書く事ができます。
定数は PHP8.2.0 以降、書く事ができるようになります(試験範囲対象外)。
トレイトは trait
キーワードで宣言します。
使う時は、使用したいクラスの中で use
キーワードで取り込みます。
複数のトレイトを使う時は、use
キーワードを並べる他に、カンマ区切りでの指定もできます。
トレイトの優先順位
継承元クラス、継承元クラスでuseしたトレイト、継承先クラス、継承先クラスでuseしたトレイトという構成がある場合、優先順位は以下の通りになります。
- 現在のクラスのメンバー
- 自身のクラスでuseしたトレイトのメンバー
- 継承元のクラスのメンバー
- 継承元のクラスでuseしたトレイトのメンバー
衝突の解決
複数のトレイトを使う場合、「同じ名前のメンバーがある」可能性があります。
同じ名前のメンバーがあるトレイトをそのまま複数useするとfatal エラーになります。
この場合、 insteadof
演算子を使って「そのメンバーの名前は、どのトレイトを使うか」を指定するか、或いは as
演算子を使ってエイリアス(別名)を付ける事で回避することができます。
また、as
演算子でアクセス権の変更をする事もできます。
トレイトに組み込まれたトレイト
トレイトの中で、別のトレイトを use する事ができます。
このコラムに関連するコードはこちらになります
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/027.php