1. 継承 VS ポリモーフィズム VS トレイト
現在、Publish.php と Answer.php の 2 つのクラスがあります。 LOG 関数を追加するには、クラス内のアクションを記録します。いくつかのオプションがあります:
継承 Polymorphic Trait 1.1. 継承
図に示すように:
コード構造は次のとおりです:
// Log.php
実際にその継承が確認できます。要件を満たしています。しかし、これはオブジェクト指向の原則に違反します。 Publish や Answer and Log などの操作間の関係は、サブクラスと親クラス間の関係ではありません。したがって、この方法で使用することはお勧めできません。
1.2. ポリモーフィック
(図に示すように):
ログの操作は同じである必要があるため、公開して回答 (回答)アクションでのロギング実装も同様です。明らかに、これは DRY (Don't Reply Yourself) 原則に違反しています。したがって、この方法で実装することはお勧めできません。
1.3. 図に示す Trait
実装コードは次のとおりです:
// Log.php endLog(); // Answer.php endLog() );
その結果、コードの複雑さを増すことなくコードの再利用を実現できたことがわかります。
1.4. 結論
継承メソッドも問題を解決できますが、そのアイデアはオブジェクト指向の原則に違反しており、ポリモーフィックメソッドも実行可能ですが、ソフトウェア開発における DRY 原則には準拠していません。メンテナンス費用が増加します。 trait メソッドは上記の欠点を回避し、比較的エレガントにコードの再利用を実現します。 2. Trait のスコープ Trait の利点を理解した後、まずスコープについて説明します。これを証明するのは簡単です。 publicF(); $this->publicF(); this-> privateF(); } } $publish = new Publish(); $publish->doPublish();上記のコードを実行すると、次のようになります: public function protected function private functionTrait のスコープは Trait クラスへの参照が内部的に表示されていることがわかります。 use キーワードは、Trait を参照するクラスに Trait の実装コードをコピーしていることがわかります。
3. Trait における属性の優先順位
優先順位について言えば、ここでの参照オブジェクトは Trait クラスとその親クラスを指します。
Trait アプリケーションの属性の優先順位を証明するには、次のコードを使用します。
publicF(); } public = new Publish(); $publish->doPublish();
上記のコードの出力は次のとおりです:
Publish::publicF public function Log::protectF protected function
上記の例を通して、 Trait 適用における優先順位は次のとおりです:
現在のクラスのメンバーは trait のメソッドをオーバーライドします。 Trait は継承されたメソッドをオーバーライドします。
クラス メンバーの優先順位は次のとおりです: 現在のクラス >Trait >親クラス
の代わりに 4.キーワード
は、次のように、クラス内の複数のトレイトを参照できます。
parameterCheck($para); $this->endLog(); } }
上記のメソッドを通じて、クラス内の複数のトレイトを参照できます。複数のトレイトを参照する場合、最も一般的な問題は、2 つのトレイトに同じ名前のプロパティまたはメソッドがある場合にどうすればよいかということです。このとき、キーワードの代わりに と as を使用する必要があります。を参照してください。次の実装コード:
parameterCheck('params'); $this ->csl(); } } $publish = new Publish(); $publish->doPublish();
上記のコードを実行すると、出力結果は次のようになります:
Log::startLog public function Check::parameterCheck パラメータ checkparams Check::startLog パブリック関数
リテラルの意味と同じように、restituteof キーワードは後者を前者に置き換え、as キーワードは置き換えられたメソッドにエイリアスを与えます。
Trait を参照するときは use キーワードが使用され、use キーワードは名前空間の参照にも使用されます。 2 つの違いは、Trait を参照するときにクラス内で使用されることです。