In diesem Artikel werden hauptsächlich Beispiele für die Verwendung von Merkmalen zur Implementierung der Code-Wiederverwendung in PHP vorgestellt. In diesem Artikel wird die einfache Verwendung von Merkmalen, Prioritätsproblemen, Problemen mit mehreren Merkmalskonflikten und wie sie zum Ändern von Zugriffskontrolle, die Verwendung von Trait in Trait usw. Freunde, die es benötigen, können sich auf
Die neuen Traits beziehen, die nach PHP5.4 hinzugefügt wurden, um den Code-Wiederverwendungsmechanismus zu implementieren, aber Sie können nicht instanziiert werden. Verwenden Sie einfach das Schlüsselwort use, um es in die Klasse einzuführen, getrennt durch „,“.(1) Trait ist einfach zu verwenden
<?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) Prioritätsproblem Trait überschreibt derzeit geerbte Methoden Die Klasse überschreibt die Trait-Methode.
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) Probleme mit mehreren Merkmalskonflikten Wenn der Konflikt nicht gelöst wird, tritt ein schwerwiegender Fehler auf
Sie können stattdessen verwenden, um zu klären, welche Methode in der zu verwendende Konflikt;
Sie können den as
-Operator verwenden, um eine der widersprüchlichen Methoden
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) umzubenennen, die zum Ändern der Methode verwendet werden können Zugriffskontrolle
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 wird in 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
verwendet (6) Trait unterstützt abstrakte Methoden, unterstützt statische Methoden und können statische Variablen nicht direkt definieren, aber statische Variablen können durch Merkmalsmethoden referenziert werden.
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) Merkmale können Attribute definieren, aber Attribute mit demselben Namen können nicht in Klassen
definiert werdenDas obige ist der detaillierte Inhalt vonSo verwenden Sie Merkmale, um die Wiederverwendung von PHP-Code zu erreichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!