This article will introduce to you how to use the trait capability in PHP. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to everyone.
I believe that everyone is no longer unfamiliar with traits. As early as 5.4, traits have already appeared in the new features of PHP. Of course, trait itself also means feature, but the main capability of this feature is for code reuse.
We all know that PHP is a modern object-oriented language. In order to solve the confusing problem of multiple inheritance in C, most languages are in the form of single inheritance and multiple interfaces, but this will also make some reusable code must be implemented through combination. If combination is to be used, it is inevitable To instantiate a class or use a static method, the memory usage is increased. In order to solve this problem, PHP officially launched the trait capability. You can think of it as a variation of combo abilities.
trait A { public $a = 'A'; public function testA() { echo 'This is ' . $this->a; } } class classA { use A; } class classB { use A; public function __construct() { $this->a = 'B'; } } $a = new classA(); $b = new classB(); $a->testA(); $b->testA();
From the above code, we can see that trait can be applied to any class, and variables can be defined, which is very convenient. The most important thing to note about traits is the overload priority of methods with the same name.
trait B { function test(){ echo 'This is trait B!'; } } trait C { function test(){ echo 'This is trait C!'; } } class testB{ use B, C; function test(){ echo 'This is class testB!'; } } $b = new testB(); $b->test(); // This is class testB! // class testC{ // use B, C; // } // $c = new testC(); // $c->test(); // Fatal error: Trait method test has not been applied, because there are collisions with other trait methods on testC
Here, the test() method is overloaded in our class, and the output here is the method in the class. If you comment out the test() method in the testB class, an error will be reported. Because the program cannot distinguish which trait's test() method you want to use. We can use insteadof to specify which trait the method to use is called.
class testE{ use B, C { B::test insteadOf C; C::test as testC; } } $e = new testE(); $e->test(); // This is trait B! $e->testC(); // This is trait C!
Of course, in actual development, we should try to standardize method names to avoid such duplication. In addition, what if the subclass references a trait and the parent class defines the same method? Of course, the methods inherited from the parent class are still called. The priority of traits is lower than that of ordinary class inheritance.
trait D{ function test(){ echo 'This is trait D!'; } } class parentD{ function test(){ echo 'This is class parentD'; } } class testD extends parentD{ use D; } $d = new testD(); $d->test(); // This is trait D!
Finally, abstract methods can also be defined in traits. This abstract method is a method that must be implemented by the class that references this trait, and has the same effect as the abstract method in the abstract class.
trait F{ function test(){ echo 'This is trait F!'; } abstract function show(); } class testF{ use F; function show(){ echo 'This is class testF!'; } } $f = new testF(); $f->test(); $f->show();
Trait is really that PHP is a very flexible function. Of course, the more flexible something is, the more we need to figure out some of its usage rules, so as to avoid some unforeseen errors.
Test code:
https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/trait%E8%83%BD%E5%8A%9B%E5%9C%A8PHP%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8.php
Recommended learning: php video tutorial
The above is the detailed content of How to use trait capabilities in PHP. For more information, please follow other related articles on the PHP Chinese website!