Heim > Artikel > Backend-Entwicklung > [php-Klassen und -Objekte]-Eigenschaft
Dieser Artikel stellt die Eigenschaft [PHP-Klassen und -Objekte] vor, die einen gewissen Referenzwert hat. Jetzt können Freunde in Not darauf verweisen >Trait (PHP 5.4.0)
Übersetzungsmerkmal
Von der Basisklasse geerbte Mitglieder werden durch von der Eigenschaft eingefügte Mitglieder überschrieben. Die Rangfolge besteht darin, dass Mitglieder der aktuellen Klasse die Methoden des Merkmals überschreiben und das Merkmal die geerbten Methoden überschreibt.
(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.)#Example #2 优先顺序示例<?phpclass Bases { public function sayHello() { echo 'Hello '; } }trait SayWorld { public function sayHello() { parent::sayHello(); echo 'World!'; } }class MyHelloWorld extends Bases { // public function sayHello(){ // echo 'the class'; // } use SayWorld; }$o = new MyHelloWorld();$o->sayHello(); //output: Hello World!?>
Example #3 另一个优先级顺序的例子<?phptrait HelloWorld { public function sayHello() { echo 'Hello World!'; } }class TheWorldIsNotEnough { use HelloWorld; public function sayHello() { echo 'Hello Universe!'; } }$o = new TheWorldIsNotEnough();$o->sayHello(); //output: Hello Universe!?>
Mehrere Merkmale werden durch Kommas getrennt in der Verwendungsanweisung aufgeführt und können alle in eine Klasse eingefügt werden.
Example #4 多个 trait 的用法<?phptrait Hello { public function sayHello() { echo 'Hello '; } }trait World { public function sayWorld() { echo 'World'; } }class MyHelloWorld { use Hello, World; public function sayExclamationMark() { echo '!'; } }$o = new MyHelloWorld();$o->sayHello();$o->sayWorld();$o->sayExclamationMark();//output: Hello World!?>
Wenn zwei Merkmale eine Methode mit demselben Namen einfügen, ohne den Konflikt explizit zu lösen, tritt ein schwerwiegender Fehler auf.
Um den Namenskonflikt mehrerer Merkmale in derselben Klasse zu lösen, müssen Sie den Statt-Operator verwenden, um explizit anzugeben, welche der widersprüchlichen Methoden verwendet werden sollen.
Mit der obigen Methode können nur andere Methoden ausgeschlossen werden, und der as-Operator kann einen Alias für eine Methode einführen. Beachten Sie, dass der as-Operator weder die Methode umbenennt noch deren Methoden beeinflusst.
<?phptrait A { public function a() { echo 'a1'; } public function b() { echo 'a2'; } }trait B { public function a() { echo 'b1'; } public function b() { echo 'b2'; } }class C { use A, B { B::a insteadof A;//insteadof 指定B类中的a方法在A类中,以解决命名冲突 B::b insteadof A; A::a as a1;//把A类中的a方法取别名为a1,以解决命名冲突 A::B as a2; } }$C = new C();$C -> a();//b1$C -> b();//b2$C -> a1();//a1$C -> a2();//a2?>
as
Example #6 修改方法的访问控制<?php trait Hello { public function traitHello() { echo "hello,trait\n"; } } // 修改 traitHello 的访问控制 class Class1 { use Hello { traitHello as protected; } } // 给方法一个访问控制的别名,原版 traitHello 的访问控制则没有发生变化 class Class2 { use Hello { Hello::traitHello as private hi; } } $Obj1 = new Class1(); // $Obj1->traitHello(); # 报致命错误,因为traitHello方法被修改成受保护的 $Obj2 = new Class2(); $Obj2->traitHello(); # 原来的traitHello方法仍然是公共的 // $Obj2->hi(); # 报致命错误,因为别名hi方法被修改成私有的
Trait unterstützt abstrakte Methoden, statische Attribute und statische Methoden
Nachdem Trait ein Attribut definiert hat, kann die Klasse keine Attribute mit demselben Namen definieren, da sonst ein schwerwiegender Fehler auftritt. Es gibt eine Ausnahme: Eigenschaften sind kompatibel (gleiche Zugriffssichtbarkeit, anfänglicher Standardwert). Wenn das Attribut vor PHP 7.0 kompatibel war, gab es eine E_STRICT-Erinnerung.<?phptrait 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();//Hello$Obj->sayWorld();//Worldecho $Obj->getWorld() . "\n";////get WorldHelloWorld::doSomething();//Doing something$Obj->inc();//1$Obj->inc();//2Verwandte Empfehlungen:
Example #12 解决冲突<?phptrait PropertiesTrait { public $same = true; public $different = false; }class PropertiesExample { use PropertiesTrait; public $same = true; // PHP 7.0.0 后没问题,之前版本是 E_STRICT 提醒 public $different = true; // 致命错误}?>[php-Klassen und -Objekte] Endgültiges Schlüsselwort [php-Klassen und -Objekte] poststatisch BindungTypbeschränkungen für [PHP-Klassen und -Objekte]
Das obige ist der detaillierte Inhalt von[php-Klassen und -Objekte]-Eigenschaft. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!