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:
Inheritance
Polymorphism
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.' 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
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!