ホームページ  >  記事  >  バックエンド開発  >  PHP でトレイトを適用する方法の詳細な図とテキストの説明

PHP でトレイトを適用する方法の詳細な図とテキストの説明

伊谢尔伦
伊谢尔伦オリジナル
2017-07-03 11:14:311166ブラウズ

PHP バージョン 5.4.0 以降、PHP はコード再利用の新しい概念である Trait を提供します。 Trait は文字通り「特性」や「機能」を意味します。Trait キーワードを使用すると、PHP のクラスに新しい特性を追加できることがわかります。

オブジェクト指向に詳しい人なら誰でも、ソフトウェア開発で一般的に使用されるコードの再利用には、継承とポリモーフィズムという 2 つの方法があることを知っています。 PHP では、単一継承のみを実現できます。特性はこれを回避します。以下、簡単な例で比較説明します。

1. 継承 VS ポリモーフィズム VS 特性

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


継承ポリモーフィズム
特性

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


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

1.4. 結論


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

2. Trait のスコープ

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

 // Log.php
<?php
trait Log{
 public function startLog() {
  // echo ..
 }
 public function endLog() {
  // echo ..
 }
}
上記のコードを実行すると、出力結果は次のようになります:
public function

protected function

private function

Trait のスコープは Trait クラスへの参照内にあり、すべて表示されます。 use キーワードは Trait の実装コードを Trait を参照するクラスにコピーしていることがわかります。

3. Trait の

属性
の優先順位


優先順位について言えば、ここでの参照オブジェクトは Trait クラスとその親クラスを指します。

次のコードを使用して、Trait アプリケーションの属性の優先順位を証明します:

// Publish.php
<?php
class Publish {
 use Log;
}
$publish = new Publish();
$publish->startLog();
$publish->endLog();

上記のコードの出力は次のとおりです:

Publish::publicF public functionLog::protectF protected function
パス 上記の例から、特性アプリケーションの優先順位は次のように要約できます:

1. 現在のクラスのメンバーが特性のメソッドをオーバーライドします

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::parameterCheck パラメータ checkparams

Check::startLog public function

文字通りの意味と同じように、replaceof キーワードは後者を前者に置き換え、as キーワードは置き換えられたメソッドにエイリアスを与えます。

Trait を参照するときは use キーワードが使用され、また use キーワードは 名前空間 を参照するためにも使用されます。 2 つの違いは、Trait を参照するときにクラス内で使用されることです。

以上がPHP でトレイトを適用する方法の詳細な図とテキストの説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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