Cet article présente principalement des exemples d'utilisation de traits pour implémenter la réutilisation de code en PHP. Cet article explique l'utilisation simple des traits, les problèmes de priorité, les problèmes de conflit de traits multiples et comment ils peuvent être utilisés pour modifier <.>Contrôle d'accès, utilisation de Trait dans Trait, etc. Les amis qui en ont besoin peuvent se référer à
Les nouveaux traits ajoutés après PHP5.4 implémentent le mécanisme de réutilisation de code. Les traits sont similaires aux classes, mais. ils ne peuvent pas être instanciés. Il n'est pas nécessaire d'hériter, il suffit d'utiliser le mot-clé use pour l'introduire dans la classe. Plusieurs traits peuvent être introduits, séparés par ','.(1) Le trait est simple à utiliser
<?php trait A { public $var1 = 'test1'; public function test1() { echo 'trait A::test1()'; } } trait B { public $var2 = 'test2'; public function test2() { echo 'trait B::test2()'; } } class C { use A,B; } $c = new C(); echo $c->var1; //test1 $c->test2(); //trait B::test2()
(2) Problème prioritaire Le trait remplacera actuellement les méthodes héritées. La classe remplacera la méthode Trait.
trait A { public $var1 = 'test'; public function test() { echo 'A::test()'; } public function test1() { echo 'A::test1()'; } } class B { public function test() { echo 'B::test()'; } public function test1() { echo 'B::test1()'; } } class C extends B{ use A; public function test() { echo 'c::test()'; } } $c = new C(); $c->test(); //c::test() $c->test1(); //A::test1()
(3) Problèmes de conflit de traits multiples Si le conflit n'est pas résolu, une erreur fatale se produira
Vous pouvez utiliser à la place pour clarifier la méthode utilisée ; le conflit à utiliser ;
Vous pouvez utiliser l'opérateur as
pour renommer l'une des méthodes en conflit
trait A { public function test() { echo 'A::test()'; } } trait B { public function test() { echo 'B::test()'; } } class C { use A,B { B::test insteadof A; B::test as t; } } $c = new C(); $c->test(); //B::test() $c->t(); //B::test() 可以用as另起名
(4) comme peut être utilisé pour modifier la méthode ; contrôle d'accès
trait HelloWorld { public function sayHello () { echo 'Hello World!' ; } } // 修改 sayHello 的访问控制 class A { use HelloWorld { sayHello as protected; } } // 给方法一个改变了访问控制的别名 // 原版 sayHello 的访问控制则没有发生变化 class B { use HelloWorld { sayHello as private myPrivateHello ; } } $b = new A(); $b->sayHello(); //Fatal error: Call to protected method A::sayHello() from context ''
(5) Trait est utilisé dans Trait
trait A { public function test1() { echo 'test1'; } } trait B { public function test2() { echo 'test2'; } } trait C { use A,B; } class D { use C; } $d = new D(); $d->test2(); //test2
(6) Trait prend en charge les méthodes abstraites, prend en charge méthodes statiques , et ne peut pas définir directement des variables statiques, mais les variables statiques peuvent être référencées par des méthodes de trait .
trait A { public function test1() { static $a = 0; $a++; echo $a; } abstract public function test2(); //可定义抽象方法 } class B { use A; public function test2() { } } $b = new B(); $b->test1(); //1 $b->test1(); //2
(7) Les traits peuvent définir des attributs, mais les attributs portant le même nom ne peuvent pas être définis dans les classes
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!