Trait は PHP 5.4 で導入された新しい概念で、クラスとインターフェースの両方のように見えますが、実際にはどちらでもありません。 PHP クラスの機能 クラスが実行できることを示すものと、モジュール形式の実装を提供するものの 2 つがあります。 Trait は、PHP の単一継承制限に対する柔軟なコード再利用メカニズムを提供するコード再利用テクノロジです。
PHP 言語は典型的な単一継承モデルを使用します。このモデルでは、まず一般的なルート クラスを作成して基本的な関数を実装し、次にこのルート クラスを拡張して、より具体的なサブクラスを作成します。親クラス。これは継承階層と呼ばれ、多くのプログラミング言語がこのパターンを使用します。この典型的な継承モデルはほとんどの場合うまく機能しますが、無関係な 2 つの PHP クラスを同様に動作させたい場合はどうすればよいでしょうか?
Trait はこの問題を解決するために生まれました。 Trait は、複数の無関係なクラスにモジュール実装を挿入することができるため、コードの再利用が向上し、DRY (Don't Reply Yourself) 原則に準拠できます。たとえば、Laravel の基礎となるユーザー認証関連のロジックとソフト削除の実装はすべて Traits を使用して実装されます。 Laravel に付属する AuthController を例に挙げると、ログイン、登録、および失敗したログイン試行回数はすべて Traits を通じて実装されます。クラスの作成と似ていますが、クラスの代わりにキーワードが trait である点が異なります。上記の ThrottlesLogin を例に挙げます。
複数の特性を使用すると、名前の競合が発生する可能性があります。解決策: replaceof キーワードを使用します。redirectPath メソッドと getGuard メソッドが AuthenticatesUsers と RegistersUsers の両方で定義されている場合、対応するメソッドは RegistersUsers ではなく AuthenticatesUsers から取得されます。さらに、 as キーワードを使用してメソッドに別名を付けることもでき、これにより名前の競合を回避することもできます。
さらに、ここに完全にリストされていない可能性がありますが、Trait は抽象メソッドと静的メソッドの定義もサポートしており、抽象メソッドはそれを使用するクラスに実装する必要があります。
ここで宣言する必要があるのは、呼び出しメソッドの優先順位です。呼び出しクラス>トレイト>親クラス(存在する場合)では、メソッドはオーバーライドできますが、属性がトレイトで定義されている場合、属性はオーバーライドできません。呼び出しクラスに属性が定義されている場合 この属性も定義すると、エラーが報告されます。
Trait の使い方
Trait の使用方法も非常に簡単です。つまり、use キーワードを使用することです。
名前空間と Trait の両方で use キーワードが使用されていることに気づいたかもしれませんが、名前空間はクラス定義の外部にインポートされるのに対し、Trait はクラスの定義本体内にインポートされます。