Home  >  Article  >  Backend Development  >  Detailed explanation of code reuse Trait usage steps

Detailed explanation of code reuse Trait usage steps

php中世界最好的语言
php中世界最好的语言Original
2018-04-11 11:54:211558browse

This time I will bring you a detailed explanation of the steps for using Traits for code reuse. What are the precautions for using Traits for code reuse? The following is a practical case, let's take a look.

Starting from PHP version 5.4.0, PHP provides a new concept of code reuse, which is Trait. Trait literally means "characteristics" and "characteristics". We can understand that using the Trait keyword can add new characteristics to classes in PHP.

Anyone who is familiar withObject-oriented knows that there are two methods of code reuse commonly used in software development: inheritance and polymorphism. In PHP, only single inheritance can be achieved. Traits avoid this. The following is a comparative explanation through a simple example.

1. Inheritance VS Polymorphism VS Trait

There are now two classes: Publish.php and Answer.php. To add LOG function to it, record the actions inside the class. There are several options:

  1. Inheritance

  2. Polymorphism

  3. Trait

1.1. Inheritance

The code structure is as follows:

// Log.php<?phpClass Log{ publicfunctionstartLog() {  // echo ... } publicfunctionendLog() {  // echo ... }}    
// Publish.php<?phpClass PublishextendsLog{}    
// Answer.php<?phpClass AnswerextendsLog{}

1.2. Polymorphism

Implementation code:

// 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. Trait

The implementation code is as follows:

// 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. Conclusion

Although the inheritance method can also solve the problem, its idea goes against The object-oriented principle seems very crude; the polymorphic method is also feasible, but it does not comply with the DRY principle in software development and increases maintenance costs. The Trait method avoids the above shortcomings and achieves code reuse relatively elegantly.

2. Scope of Trait

After understanding the benefits of Trait, we also need to understand the rules in its implementation. Let’s talk about scope first. This is easier to prove. The implementation code is as follows:

<?phpclassPublish { useLog; publicfunctiondoPublish() 
{  $this->publicF();  $this->protectF();  $this->privateF(); }}
$publish=newPublish();$publish->doPublish();    
publicfunctionprotectedfunctionprivatefunction

It can be found that the scope of the Trait is within the reference of the Trait class. visible. It can be understood that the use keyword copies the implementation code of the Trait into the class that references the Trait.

3. Priority of attributes in Trait

When it comes to priority, there must be a reference object for comparison. The reference object here refers to the Trait class and its parent class.

Use the following code to prove the priority of attributes in the Trait application:

<?phptrait Log{ publicfunctionpublicF() 
{  echoMETHOD.&#39; public function&#39;. PHP_EOL; } protectedfunctionprotectF() 
{  echoMETHOD.&#39; protected function&#39;. PHP_EOL; }}classQuestion{ publicfunctionpublicF() 
{  echoMETHOD.&#39; public function&#39;. PHP_EOL; } protectedfunctionprotectF() 
{  echoMETHOD.&#39; protected function&#39;. PHP_EOL; }}classPublishextendsQuestion{ useLog; publicfunctionpublicF() 
{  echoMETHOD.&#39; public function&#39;. PHP_EOL; } publicfunctiondoPublish() {  $this->publicF();  $this->protectF(); }}
$publish=newPublish();$publish->doPublish();    
上述代码的输出结果如下:
Publish::publicFpublicfunctionLog::protectFprotectedfunction

Members from the current class override the trait method

trait overrides The inherited method

class member priority is: current class>Trait> parent class

Just like the literal meaning, the insteadof keyword replaces the latter with the former, and the as keyword gives The superseded method is given an alias.

When referencing Trait, the use keyword is used, and the use keyword is also used to refer to the namespace. The difference between the two is that when referencing Trait, it is used inside the class.

I believe you have mastered the method after reading the case in this article. For more exciting information, please pay attention to other related articles on the php Chinese website!

Recommended reading:

How to remove null values ​​or empty elements in an array in PHP

php implements a logging function

The above is the detailed content of Detailed explanation of code reuse Trait usage steps. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn