PHP バージョン 5.4.0 以降、PHP はコード再利用の新しい概念である Trait を提供します。 Trait は文字通り「特性」や「機能」を意味します。Trait キーワードを使用すると、PHP のクラスに新しい特性を追加できることがわかります。
オブジェクト指向に詳しい人なら誰でも、ソフトウェア開発で一般的に使用されるコードの再利用には、継承とポリモーフィズムという 2 つの方法があることを知っています。 PHP では、単一継承のみを実現できます。特性はこれを回避します。以下、簡単な例で比較説明します。
1. 継承 VS ポリモーフィズム VS 特性
継承ポリモーフィズム
特性
1.1 に示すように:
コード構造は次のとおりです:
// Log.php <?php Class Log { public function startLog() { // echo ... } public function endLog() { // echo ... } }
// Publish.php <?php Class Publish extends Log { } // Answer.php <?php Class Answer extends Log { }さて、継承が要件を満たしていることがわかりました。しかし、これはオブジェクト指向の原則に違反します。 Publish や Answer and Log などの操作間の関係は、サブクラスと親クラス間の関係ではありません。したがって、この方法で使用することはお勧めできません。 1.2. ポリモーフィック
図に示すように:
実装コード:
// Log.php <?php Interface Log { public function startLog(); public function endLog(); }
// Publish.php <?php Class Publish implements Log { public function startLog() { // TODO: Implement startLog() method. } public function endLog() { // TODO: Implement endLog() method. } }
// Answer.php <?php Class Answer implements Log { public function startLog() { // TODO: Implement startLog() method. } public function endLog() { // TODO: Implement endLog() method. } }したがって、Publish と Answerアクションでのロギングの実装は同じ。明らかに、これは DRY (Don't Reply Yourself) 原則に違反しています。したがって、この方法で実装することはお勧めできません。 1.3. 図に示す Trait
実装コードは次のとおりです。コード。
継承メソッドでも問題を解決できますが、そのアイデアはオブジェクト指向の原則に違反しており、ポリモーフィックメソッドも実行可能であるように見えますが、それは実現可能ではありません。ソフトウェア開発における DRY の原則により、メンテナンスコストが増加します。 trait メソッドは上記の欠点を回避し、比較的エレガントにコードの再利用を実現します。
2. Trait のスコープ
Trait の利点を理解した後、まずスコープについて話しましょう。これを証明するのは簡単です。 // Log.php
<?php
trait Log{
public function startLog() {
// echo ..
}
public function endLog() {
// echo ..
}
}
上記のコードを実行すると、出力結果は次のようになります:
public function
private function
Trait のスコープは Trait クラスへの参照内にあり、すべて表示されます。 use キーワードは Trait の実装コードを Trait を参照するクラスにコピーしていることがわかります。
属性
の優先順位
優先順位について言えば、ここでの参照オブジェクトは Trait クラスとその親クラスを指します。
// Publish.php <?php class Publish { use Log; } $publish = new Publish(); $publish->startLog(); $publish->endLog();
Publish::publicF public functionLog::protectF protected function
パス 上記の例から、特性アプリケーションの優先順位は次のように要約できます:
2. 特性が継承されたメソッドをオーバーライドします
クラスメンバーの優先順位は次のとおりです: 現在クラス> ;トレイト>親クラス
4. キーワードの代わりに
次のように、1つのクラスで複数のトレイトを参照できます:// Answer.php
<?php
class Answer {
use Log;
}
$answer = new Answer();
$answer->startLog();
$answer->endLog();
上記のメソッドを通じて、1つのクラストレイトで複数のトレイトを参照できます。 。複数のトレイトを参照する場合、最も一般的な問題は、2 つのトレイトに同じ名前のプロパティまたはメソッドがある場合にどうすればよいかということです。このとき、 .Please の代わりにキーワードを使用する必要があります。次の実装コードを参照してください:
<?php class Publish { use Log; public function doPublish() { $this->publicF(); $this->protectF(); $this->privateF(); } } $publish = new Publish(); $publish->doPublish();
上記のコードを実行すると、出力結果は次のようになります:
Log::startLog public function
Check::startLog public function
文字通りの意味と同じように、replaceof キーワードは後者を前者に置き換え、as キーワードは置き換えられたメソッドにエイリアスを与えます。 Trait を参照するときは use キーワードが使用され、また use キーワードは 名前空間 を参照するためにも使用されます。 2 つの違いは、Trait を参照するときにクラス内で使用されることです。
以上がPHP でトレイトを適用する方法の詳細な図とテキストの説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。