PHPシリーズの現代の新機能(3) - 形質の概要

     形質がPHP 5.4で導入された新しい概念であり、インターフェースは、その役割は2つあり、実際、形質は実装クラスの一部として、1つ以上の既存のPHPクラスと混合することができる見ることができないの両方のようなクラス、次のようになります。どのクラスが行うことができますことを示し、モジュラー実装を提供します。形質は、コードの再利用単一継承制限PHPのための柔軟なメカニズムを提供し、コード多重です。

なぜ形質

     典型的な単一継承モデルを使用してPHP言語は、このモデルでは、まず、共通のルートクラス、基本的な関数を記述し、このルートクラスを拡張し、より具体的なサブカテゴリーを作成するには、直接の親クラスの実装から継承されました。これは、継承階層と呼ばれ、多くのプログラミング言語には、このモードを使用します。時間のほとんどは、この典型的な継承モデルがうまく機能することができますが、類似の挙動を持つ2つの無関係なPHPクラスをしたい場合、どのようにそれを行うには?

     トレイトが生まれ、この問題を解決することです。これにより、コードの再利用、コンプライアンスDRY(あなた自身を繰り返してはいけない)の原則を改善し、モジュール式の実装に依存しない複数のクラスを注入することができた形質。例えば、ソフトの他の場所を達成削除ロジックとユーザー認証関連の基礎となるLaravelは達成するために形質を使用しています。LaravelはしてくるAuthController、例えば、ログイン、登録とログイン失敗の試みの一つが、形質によって達成されています。

     

形質を作成する方法

     形質を作成すると、キーワードが使用されていることを除いて、多少類似してクラスを作成し、シンプルであるtrait代わりにclass、上記のThrottlesLogin例を:

     

     私たちは、trait形質の定義は、その後、クラスのように、我々は、この形質で使用するプロパティとメソッドを定義することを宣言します。

     例えば、1つ以上(パーティション複数)によって形質形質に組み合わささらに形質ネストとの組み合わせ、すなわち、AuthenticatesAndRegistersUsersケースです。

     

     使用多个Trait可能会引起命名冲突问题,上面的代码给出了解决方案:使用insteadof关键字,如果AuthenticatesUsersRegistersUsers中都定义了redirectPathgetGuard方法,那么将从AuthenticatesUsers中获取对应方法而不是RegistersUsers。另外还可以使用as关键字为方法起个别名,这样也可以避免命名冲突。

     此外,这里可能没有完整列出,Trait中还支持定义抽象方法和静态方法,其中抽象方法必须在使用它的类中实现。

     这里还需要声明的一点是调用方法的优先级:调用类>Trait>父类(如果有的话),方法可以覆盖,但属性不行,如果Trait中定义了一个属性,如果调用类中也定义这个属性则会报错。

如何使用Trait

     Trait的使用方法也很简单,上面已经显示的很清楚明了,即使用use关键字。

     可能你已经注意到,命名空间和Trait使用的都是use关键字,不同之处在于导入位置,命名空间在类的定义体外导入,而Trait在类的定义体内导入。

注:PHP解释器在编译时会把Trait复制到类的定义体中,但是不会处理这个操作引入的不兼容问题,如果Trait假定类中有特定的属性或方法,需要先确保类中确实有相应的属性或方法。

 

おすすめ

転載: www.cnblogs.com/mzhaox/p/11222199.html