ホームページ >バックエンド開発 >PHPチュートリアル >最新の PHP 新機能シリーズ (3) -- 特性の概要

最新の PHP 新機能シリーズ (3) -- 特性の概要

WBOY
WBOYオリジナル
2016-06-23 13:06:32862ブラウズ

Trait は PHP 5.4 で導入された新しい概念で、クラスとインターフェースの両方のように見えますが、実際にはどちらでもありません。 PHP クラスの機能 クラスが実行できることを示すものと、モジュール形式の実装を提供するものの 2 つがあります。 Trait は、PHP の単一継承制限に対する柔軟なコード再利用メカニズムを提供するコード再利用テクノロジです。

Trait を使用する理由

PHP 言語は典型的な単一継承モデルを使用します。このモデルでは、まず一般的なルート クラスを作成して基本的な関数を実装し、次にこのルート クラスを拡張して、より具体的なサブクラスを作成します。親クラス。これは継承階層と呼ばれ、多くのプログラミング言語がこのパターンを使用します。この典型的な継承モデルはほとんどの場合うまく機能しますが、無関係な 2 つの PHP クラスを同様に動作させたい場合はどうすればよいでしょうか?

Trait はこの問題を解決するために生まれました。 Trait は、複数の無関係なクラスにモジュール実装を挿入することができるため、コードの再利用が向上し、DRY (Don't Reply Yourself) 原則に準拠できます。たとえば、Laravel の基礎となるユーザー認証関連のロジックとソフト削除の実装はすべて Traits を使用して実装されます。 Laravel に付属する AuthController を例に挙げると、ログイン、登録、および失敗したログイン試行回数はすべて Traits を通じて実装されます。クラスの作成と似ていますが、クラスの代わりにキーワードが trait である点が異なります。上記の ThrottlesLogin を例に挙げます。

trait 宣言を通じて定義するものは Trait であり、属性とメソッドを定義できます。このトレイトでクラスのように使用されます。 さらに、特性はネストと組み合わせをサポートしています。つまり、AuthenticatesAndRegistersUsers のように、1 つ以上の特性 (, で区切られている) が 1 つの特性に結合されます。

複数の特性を使用すると、名前の競合が発生する可能性があります。解決策: replaceof キーワードを使用します。redirectPath メソッドと getGuard メソッドが AuthenticatesUsers と RegistersUsers の両方で定義されている場合、対応するメソッドは RegistersUsers ではなく AuthenticatesUsers から取得されます。さらに、 as キーワードを使用してメソッドに別名を付けることもでき、これにより名前の競合を回避することもできます。

さらに、ここに完全にリストされていない可能性がありますが、Trait は抽象メソッドと静的メソッドの定義もサポートしており、抽象メソッドはそれを使用するクラスに実装する必要があります。

ここで宣言する必要があるのは、呼び出しメソッドの優先順位です。呼び出しクラス>トレイト>親クラス(存在する場合)では、メソッドはオーバーライドできますが、属性がトレイトで定義されている場合、属性はオーバーライドできません。呼び出しクラスに属性が定義されている場合 この属性も定義すると、エラーが報告されます。

Trait の使い方

Trait の使用方法も非常に簡単です。つまり、use キーワードを使用することです。

名前空間と Trait の両方で use キーワードが使用されていることに気づいたかもしれませんが、名前空間はクラス定義の外部にインポートされるのに対し、Trait はクラスの定義本体内にインポートされます。

注: PHP インタープリターはコンパイル中に特性をクラスの定義本体にコピーしますが、この操作によって引き起こされる非互換性の問題は処理しません。特性がクラス内に特定の属性またはメソッドがあることを前提としている場合は、最初にクラスが実際に に対応するプロパティまたはメソッドがあることを確認する必要があります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。