Einfach ausgedrückt: Das Schlüsselwort trait wird in PHP verwendet, um das Problem zu lösen, dass eine Klasse die Attribute und Methoden einer Basisklasse integrieren möchte, aber auch Methoden anderer Basisklassen haben möchte und Merkmale werden im Allgemeinen in Verbindung mit der Verwendung verwendet.
Werfen wir einen Blick auf die Verwendung der in diesem Artikel vorgestellten Merkmale in PHP
<?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(); ?>
Die Ausgabeergebnisse lauten wie folgt:
study eat driving trait
In Im obigen Beispiel erbt die Student-Klasse Person bis und verfügt über die Eat-Methode. Durch die Kombination von Drive verfügt sie über 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?
<?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(); ?>
Die Ausgabeergebnisse lauten wie folgt:
hello student driving from drive
Daher wird der Schluss gezogen, dass die Methode in der aktuellen Klasse den Namen des Merkmals überschreibt, wenn eine Methode oder ein Attribut denselben Namen hat Methode, und die Methode des Merkmals überschreibt die Methode in der Basisklasse.
Wenn Sie mehrere Traits kombinieren möchten, trennen Sie die Trait-Namen durch Kommas:
use Trait1, Trait2;
Was passiert, wenn mehrere Traits Methoden oder Eigenschaften mit demselben Namen enthalten? 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; } ?>
Das Ausgabeergebnis lautet wie folgt:
Der Code lautet 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 zum Auflösen anstelle von und alsOperator Konflikte, stattdessen wird eine Methode verwendet, die eine andere ersetzt, und as ist ein Alias für die Methode. Bitte sehen Sie sich den Code für die spezifische Verwendung an:
<?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(); ?>
Die Ausgabeergebnisse sind wie folgt:
Trait2::hello Trait1::hi Trait2::hello Trait1::hi Trait2::hi Trait1::hello
Das as-Schlüsselwort hat eine andere Verwendung. Eine Verwendung besteht darin, die Zugriffskontrolle der Methode zu ändern:
Trait kann auch mit Trait kombiniert werden, das abstrakte Methoden unterstützt, statisch Attribute und statische Methoden. Der Testcode 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 Ausgabeergebnis lautet wie folgt:
Hello World get World Doing something 1 2
Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung zur Verwendung der neuesten PHP-Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!