PHP ist eine einzelne Vererbungssprache . Bevor PHP 5.4 Traits erschien, konnten PHP-Klassen nicht gleichzeitig Eigenschaften oder Methoden von zwei Basisklassen erben. Die Kombinationsfunktion der Merkmale von PHP ähnelt der der Go-Sprache. Der Name des zu kombinierenden Merkmals wird mithilfe des Schlüsselworts „use“ in der Klasse deklariert. Die Deklaration eines bestimmten Merkmals verwendet jedoch das Schlüsselwort „trait“, und das Merkmal kann nicht verwendet werden direkt instanziiert werden. Informationen zur spezifischen Verwendung finden Sie im folgenden Code:
<?php trait Drive { public $carName = 'trait'; public function driving() { echo "driving {$this->carName}\n"; } } class Person { public function eat() { echo "eat\n"; } } class Student extends Person { use Drive; public function study() { echo "study\n"; } } $student = new Student(); $student->study(); $student->eat(); $student->driving();
Das Ausgabeergebnis lautet wie folgt:
study eat driving trait
Im obigen Beispiel erbt die Student-Klasse Person und hat die Wenn wir Drive kombinieren, haben wir die Fahrmethode und das Attribut carName.
Wenn es in Trait, Basisklasse und dieser Klasse eine Eigenschaft oder Methode mit demselben Namen gibt, welche wird am Ende beibehalten? Testen Sie es mit dem folgenden Code:
<?php trait Drive { public function hello() { echo "hello drive\n"; } public function driving() { echo "driving from drive\n"; } } class Person { public function hello() { echo "hello person\n"; } public function driving() { echo "driving from person\n"; } } class Student extends Person { use Drive; public function hello() { echo "hello student\n"; } } $student = new Student(); $student->hello(); $student->driving();
Das Ausgabeergebnis lautet wie folgt:
hello student driving from drive
Daher wird der Schluss gezogen, dass, wenn eine Methode oder ein Attribut denselben Namen hat, die Methode in der aktuellen Klasse überschreibt die Trait-Methode und die Trait-Methode überschreibt die Methode in der Basisklasse.
Wenn Sie mehrere Traits kombinieren möchten, trennen Sie die Trait-Namen durch Kommas:
verwenden Sie Trait1, Trait2;
Wenn mehrere Traits Methoden oder Eigenschaften mit dem enthalten gleicher Name, was wird passieren? Die Antwort lautet: Wenn mehrere kombinierte Merkmale Eigenschaften oder Methoden mit demselben Namen enthalten, müssen diese explizit deklariert werden, um Konflikte zu lösen, da andernfalls ein schwerwiegender Fehler auftritt.
<?php trait Trait1 { public function hello() { echo "Trait1::hello\n"; } public function hi() { echo "Trait1::hi\n"; } } trait Trait2 { public function hello() { echo "Trait2::hello\n"; } public function hi() { echo "Trait2::hi\n"; } } class Class1 { use Trait1, Trait2; }
Die Ausgabeergebnisse lauten wie folgt:
PHP Fatal error: Trait method hello has not been applied, because there are collisions with other trait methods on Class1 in ~/php54/trait_3.php on line 20
Verwenden Sie die Operatoren „Stattstatt“ und „As“, um Konflikte zu lösen. Statt verwendet eine Methode, um eine andere zu ersetzen, und „As“. Es dient dazu, der Methode einen Alias zu geben. Informationen zur spezifischen Verwendung finden Sie im Code:
<?php trait Trait1 { public function hello() { echo "Trait1::hello\n"; } public function hi() { echo "Trait1::hi\n"; } } trait Trait2 { public function hello() { echo "Trait2::hello\n"; } public function hi() { echo "Trait2::hi\n"; } } class Class1 { use Trait1, Trait2 { Trait2::hello insteadof Trait1; Trait1::hi insteadof Trait2; } } class Class2 { use Trait1, Trait2 { Trait2::hello insteadof Trait1; Trait1::hi insteadof Trait2; Trait2::hi as hei; Trait1::hello as hehe; } } $Obj1 = new Class1(); $Obj1->hello(); $Obj1->hi(); echo "\n"; $Obj2 = new Class2(); $Obj2->hello(); $Obj2->hi(); $Obj2->hei(); $Obj2->hehe();
Trait2::hello Trait1::hi Trait2::hello Trait1::hi Trait2::hi Trait1::hello
Zugriffskontrolle:
<?php trait Hello { public function hello() { echo "hello,trait\n"; } } class Class1 { use Hello { hello as protected; } } class Class2 { use Hello { Hello::hello as private hi; } } $Obj1 = new Class1(); $Obj1->hello(); # 报致命错误,因为hello方法被修改成受保护的 $Obj2 = new Class2(); $Obj2->hello(); # 原来的hello方法仍然是公共的 $Obj2->hi(); # 报致命错误,因为别名hi方法被修改成私有的
statische Eigenschaften und statische Methoden Der Code lautet wie folgt:
<?php trait Hello { public function sayHello() { echo "Hello\n"; } } trait World { use Hello; public function sayWorld() { echo "World\n"; } abstract public function getWorld(); public function inc() { static $c = 0; $c = $c + 1; echo "$c\n"; } public static function doSomething() { echo "Doing something\n"; } } class HelloWorld { use World; public function getWorld() { return 'get World'; } } $Obj = new HelloWorld(); $Obj->sayHello(); $Obj->sayWorld(); echo $Obj->getWorld() . "\n"; HelloWorld::doSomething(); $Obj->inc(); $Obj->inc();
Das obige ist der detaillierte Inhalt vonZusammenfassung der Verwendung von Traits in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!