今回は、Traits をコードの再利用に使用する手順について詳しく説明します。コードの再利用に Traits を使用する場合の 注意事項 は何ですか?実際のケースを見てみましょう。
PHP バージョン 5.4.0 以降、PHP はコード再利用の新しい概念である Trait を提供します。 Trait は文字通り「特性」「特性」を意味します。Trait キーワードを使用すると、PHP のクラスに新しい特性を追加できることがわかります。 オブジェクト指向に詳しい人なら誰でも、ソフトウェア開発で一般的に使用されるコードの再利用には継承とポリモーフィズムという 2 つの方法があることを知っています。 PHP では、単一継承のみを実現できます。特性はこれを回避します。以下、簡単な例で比較説明します。
1. 継承 VS ポリモーフィズム VS トレイト現在、Publish.php と Answer.php の 2 つのクラスがあります。 LOG 関数を追加するには、クラス内のアクションを記録します。いくつかのオプションがあります:
コード構造は次のとおりです:
// Log.php<?phpClass Log{ publicfunctionstartLog() { // echo ... } publicfunctionendLog() { // echo ... }} // Publish.php<?phpClass PublishextendsLog{} // Answer.php<?phpClass AnswerextendsLog{}
1.2。
実装コード: // Log.php<?phpInterface Log{ publicfunctionstartLog(); publicfunctionendLog();}
// Publish.php<?phpClass PublishimplementsLog{ publicfunctionstartLog() { // TODO: Implement startLog() method. } publicfunctionendLog() { // TODO: Implement endLog() method. }}
// Answer.php<?phpClass AnswerimplementsLog{ publicfunctionstartLog() { // TODO: Implement startLog() method. } publicfunctionendLog() { // TODO: Implement endLog() method. }}
1.3. 特性
実装コードは次のとおりです:
// Log.php<?phptrait Log{ publicfunctionstartLog() { // echo .. } publicfunctionendLog() { // echo .. }} // Publish.php<?phpclassPublish { useLog;}$publish=newPublish();$publish->startLog();$publish->endLog(); // Answer.php<?phpclassAnswer { useLog;}$answer=newAnswer();$answer->startLog();$answer->endLog();
1.4. 結論
継承メソッドでも問題は解決できますが、そのアイデアはオブジェクト指向の原則に違反しており、非常に粗雑な方法です。これも実現可能ですが、ソフトウェア開発における DRY 原則に準拠しておらず、メンテナンスコストが増加します。 trait メソッドは上記の欠点を回避し、比較的エレガントにコードの再利用を実現します。
トレイトの利点を理解した後、まずスコープについて説明します。これを証明するのは簡単です。実装コードは次のとおりです。
<?phpclassPublish { useLog; publicfunctiondoPublish() { $this->publicF(); $this->protectF(); $this->privateF(); }} $publish=newPublish();$publish->doPublish(); publicfunctionprotectedfunctionprivatefunction
内に Trait のスコープが表示されていることがわかります。 use キーワードは、Trait を参照するクラスに Trait の実装コードをコピーしていることがわかります。 |
優先順位 優先順位に関しては、ここでの参照オブジェクトは Trait クラスとその親クラスを指します。 。
次のコードは、トレイト アプリケーションの属性の優先順位を証明するために使用されます:
<?phptrait Log{ publicfunctionpublicF() { echoMETHOD.' public function'. PHP_EOL; } protectedfunctionprotectF() { echoMETHOD.' protected function'. PHP_EOL; }}classQuestion{ publicfunctionpublicF() { echoMETHOD.' public function'. PHP_EOL; } protectedfunctionprotectF() { echoMETHOD.' protected function'. PHP_EOL; }}classPublishextendsQuestion{ useLog; publicfunctionpublicF() { echoMETHOD.' public function'. PHP_EOL; } publicfunctiondoPublish() { $this->publicF(); $this->protectF(); }} $publish=newPublish();$publish->doPublish(); 上述代码的输出结果如下: Publish::publicFpublicfunctionLog::protectFprotectedfunction
現在のクラスのメンバーはトレイトのメソッドをオーバーライドします
トレイトは継承されたメソッドをオーバーライドします
クラス メンバーの優先順位は次のとおりです: 現在のクラス > ;Trait>Parent Class
文字通りの意味と同じように、restituteof キーワードは後者を前者に置き換え、as キーワードは置き換えられたメソッドにエイリアスを与えます。
Trait を参照するときは use キーワードが使用され、また use キーワードは
を参照するためにも使用されます。 2 つの違いは、Trait を参照するときにクラス内で使用されることです。 この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。
推奨読書:
PHPで配列内のnull値または空の要素を削除する方法phpはログ機能を実装しています以上がコード再利用の詳細な説明 Trait の使用手順の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。