ホームページ  >  記事  >  PHPでのTraitの詳しい説明と応用

PHPでのTraitの詳しい説明と応用

小云云
小云云オリジナル
2017-11-04 09:40:281767ブラウズ

1. 継承 VS ポリモーフィズム VS トレイト

現在、Publish.php と Answer.php の 2 つのクラスがあります。 LOG 関数を追加するには、クラス内のアクションを記録します。いくつかのオプションがあります:

継承 Polymorphic Trait 1.1. 継承

図に示すように:

PHPでのTraitの詳しい説明と応用

コード構造は次のとおりです:

// Log.php

実際にその継承が確認できます。要件を満たしています。しかし、これはオブジェクト指向の原則に違反します。 Publish や Answer and Log などの操作間の関係は、サブクラスと親クラス間の関係ではありません。したがって、この方法で使用することはお勧めできません。

1.2. ポリモーフィック

(図に示すように):

PHPでのTraitの詳しい説明と応用

ログの操作は同じである必要があるため、公開して回答 (回答)アクションでのロギング実装も同様です。明らかに、これは DRY (Don't Reply Yourself) 原則に違反しています。したがって、この方法で実装することはお勧めできません。

1.3. 図に示す Trait

実装コードは次のとおりです:

// Log.php endLog(); // Answer.php endLog() );

その結果、コードの複雑さを増すことなくコードの再利用を実現できたことがわかります。

1.4. 結論PHPでのTraitの詳しい説明と応用

継承メソッドも問題を解決できますが、そのアイデアはオブジェクト指向の原則に違反しており、ポリモーフィックメソッドも実行可能ですが、ソフトウェア開発における DRY 原則には準拠していません。メンテナンス費用が増加します。 trait メソッドは上記の欠点を回避し、比較的エレガントにコードの再利用を実現します。

2. Trait のスコープ

Trait の利点を理解した後、まずスコープについて説明します。これを証明するのは簡単です。

publicF(); $this->publicF(); this-> privateF(); } } $publish = new Publish(); $publish->doPublish();

上記のコードを実行すると、次のようになります:

public function protected function private function

Trait のスコープは 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 を参照するときにクラス内で使用されることです。


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