Wenn es um die Wiederverwendung von Code in PHP geht, denken wir möglicherweise zunächst an Vererbung. Sobald diese einzelne Vererbungssprache jedoch zu viele Unterklassen ableitet, führt dies zu einer Reihe von Problemen, z. B. zu übermäßiger Abhängigkeit von übergeordneten Klassen Kopplung groß, wodurch die Kapselung der Klasse zerstört wird. Gibt es also einen besseren Weg, die Wiederverwendung von Code zu erreichen?
Seit PHP 5.4.0 hat PHP eine weitere Methode zur Code-Wiederverwendung namens Traits implementiert.
Traits ist ein Code-Wiederverwendungsmechanismus für Sprachen mit einfacher Vererbung wie PHP. Merkmale sollen die Einschränkungen von Sprachen mit einfacher Vererbung verringern und Entwicklern die freie Wiederverwendung von Methodensätzen in unabhängigen Klassen innerhalb verschiedener Hierarchien ermöglichen. Die Semantik von Merkmalen und die Klassenzusammensetzung definieren eine Möglichkeit, die Komplexität zu reduzieren und die typischen Probleme zu vermeiden, die mit traditioneller Mehrfachvererbung und Mixins verbunden sind.
Die Verwendung von Traits ist sehr einfach, verwenden Sie einfach das Schlüsselwort use in der Klasse.
trait A { public function test() { echo 'trait A::test()'; } }class b { use A; }$b=new b();$b->test();
Einfach ausgedrückt ist die Trait-Priorität höher als die Methode der übergeordneten Klasse, aber niedriger als die Methode der aktuellen Klasse.
trait A { public function test() { echo 'trait A::test()'; } public function test1() { echo 'trait A::test1()'; } }class base{ public function test(){ echo 'base::test()'; } public function test1(){ echo 'base::test1()'; } }class b extends base{ use A; public function test(){ echo 'b::test()'; } }$b=new b();$b->test();//b::test()$b->test1();//trait A::test1()
Wenn mehrere Traits verwendet werden und derselbe Methodenname vorhanden ist, tritt ein Konflikt auf. Verwenden Sie „statt“ und „as“, um das Problem des Methodennamenkonflikts zu lösen.
statt kann eine bestimmte Methode mit zwei identischen Methodennamen deklarieren.
trait A { public function test() { echo 'trait A::test()'; } }trait B { public function test() { echo 'trait B::test()'; } }class c{ use A,B{ A::test insteadof B;//使用 insteadof 明确使用哪个方法 B::test as testB;//使用 as 修改另外一个方法名称,必须在使用 insteadof 解决冲突后使用 } }$c=new c();$c->test();//trait A::test()$c->testB();//trait B::test()
Mit dem Schlüsselwort as können wir die Zugriffsberechtigungen der Trait-Methode ändern
trait A { public function test() { echo 'trait A::test()'; } private function test1(){ echo 'trait A::test1()'; } }class b{ use A{ test as protected; test1 as public test2;//更改权限时还可以修改名称 } }$b=new b();$b->test();//Fatal error: Call to protected method b::test()$b->test2();//trait A::test1()
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
Trait kann Attribute definieren, aber das gleichnamige Attribut kann nicht in der Klasse definiert werden
trait A { public $test1; } class B { use A; public $test; public $test1;//Strict Standards: B and A define the same property ($test1) in the composition of B... }
Trait unterstützt abstrakte Methoden und statische Methoden und kann dies nicht direkt sein Definieren Sie statische Variablen, 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
Die Verwendungsmethode dieser Merkmalsverwendung ähnelt wahrscheinlich etwas dem Aufruf in Javascript, bei dem ein anderes Objekt in die Ausführungsumgebung des aktuellen Objekts eingebunden wird. Natürlich ist Javascript eine prototypbasierte Sprache. Es gibt keinen Vergleich zwischen den beiden. Es ist nur so, dass die Verwendungsmethoden fast gleich sind, was zum Verständnis beiträgt.
function a() { this.name="a"; this.getName=function(){ console.log(this.name); } }function b(){ this.name="b"; a.call(this); }var b = new b(); b.getName();//a
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung des Mechanismus zur Wiederverwendung von Merkmalen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!