PHP ist eine Sprache mit einfacher Vererbung. Um dieses Problem zu lösen, konnten PHP-Klassen nicht gleichzeitig Eigenschaften oder Methoden von zwei Basisklassen erben Problem, PHP hat Traits eingeführt. (Die Kombinationsfunktion der Traits- und Go-Sprache ist etwas ähnlich)
Verwendung: Verwenden Sie das Schlüsselwort use in der Klasse, um den zu kombinierenden Trait-Namen zu deklarieren, und die Deklaration eines bestimmten Traits verwendet das Schlüsselwort trait und Das Merkmal kann nicht direkt instanziiert werden.
<?php trait Drive { public $carName = 'BMW'; public function driving() { echo "driving {$this->carName}\n"; } } class Person { public function age() { echo "i am 18 years old\n"; } } class Student extends Person { use Drive; public function study() { echo "Learn to drive \n"; } } $student = new Student(); $student->study(); //输出:Learn to drive $student->age(); //输出:i am 18 years old $student->driving();//输出:driving BMW
Schlussfolgerung:
Die Student-Klasse erbt Person und verfügt über die Altersmethode
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? Testen Sie es mit dem folgenden Code:
<?php trait Drive { public function hello() { echo "hello 周伯通\n"; } public function driving() { echo "周伯通不会开车\n"; } } class Person { public function hello() { echo "hello 大家好\n"; } public function driving() { echo "大家都会开车\n"; } } class Student extends Person { use Drive;//trait 的方法覆盖了基类Person中的方法,所以Person中的hello 和driving被覆盖 public function hello() { echo "hello 新学员\n";//当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,所以此处hello会覆盖trait中的 hello } } $student = new Student(); $student->hello(); //输出:hello 新学员 $student->driving(); //输出:周伯通不会开车
Schlussfolgerung: Wenn eine Methode oder ein Attribut denselben Namen hat, überschreibt die Methode in der aktuellen Klasse die Methode des Merkmals 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:
verwenden Sie Trait1, Trait2;
Was passiert, wenn mehrere Traits Methoden oder Eigenschaften mit denselben Eigenschaften enthalten? Name? Wolltuch? 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; } //输出:Fatal error: Trait method hello has not been applied, because there are collisions with other trait methods on Class1 in
Verwenden Sie die Operatoren „sstatt statt“ und „as“, um Konflikte zu lösen, während „as“ der Methode einen Alias gibt:
<?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();
Ausgabe
Trait2::hello Trait1::hi Trait2::hello Trait1::hi Trait2::hi Trait1::hello
<?php trait Hello { public function hello() { echo "hello,我是周伯通\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,我是周伯通,因为原来的hello方法仍然是公共的 $Obj2->hi(); # 报致命错误,因为别名hi方法被修改成私有的
Uncaught Error: Call to protected method Class1::hello() from context '' in D:\web\mytest\p.php:18
Trait unterstützt abstrakte Methoden, statische Eigenschaften und statische Methoden:
<?php trait Hello { public function sayHello() { echo "Hello 我是周伯通\n"; } } trait World { use Hello; public function sayWorld() { echo "hello 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 'do you get World ?'; } } $Obj = new HelloWorld(); $Obj->sayHello(); $Obj->sayWorld(); echo $Obj->getWorld() . "\n"; HelloWorld::doSomething(); $Obj->inc(); $Obj->inc();
Ausgabe
Hello 我是周伯通 hello world do you get World ? Doing something12
Das obige ist der detaillierte Inhalt vonVerwendung und Beispiele von Trait in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!