Middle
Ko darīt, ja diviem traits ir vienāds metodes nosaukums?
sobes.tech AI
Atbilde no AI
Kad notiek metoņu vārdu sadursme ar traits, ir vairākas risinājumu iespējas:
-
Prefiksa operators
insteadof: ļauj izvēlēties konkrētu trait metodi, kas tiks izmantota, ignorējot vienādu nosaukumu citā trait.<?php trait TraitA { public function doSomething() { echo "No TraitA"; } } trait TraitB { public function doSomething() { echo "No TraitB"; } } class MyClass { use TraitA, TraitB { TraitA::doSomething insteadof TraitB; // Izvēlamies no TraitA } } $obj = new MyClass(); $obj->doSomething(); // Izvadīs "No TraitA"Var norādīt vairākus izņēmumus:
<?php trait TraitA { public function methodA() { echo "A_a"; } public function methodB() { echo "A_b"; } } trait TraitB { public function methodA() { echo "B_a"; } public function methodB() { echo "B_b"; } } class MyClass { use TraitA, TraitB { TraitA::methodA insteadof TraitB; TraitB::methodB insteadof TraitA; } } -
Prefiksa operators
as: ļauj pārsaukt konfliktējošo metodi.<?php trait TraitA { public function doSomething() { echo "No TraitA"; } } trait TraitB { public function doSomething() { echo "No TraitB"; } } class MyClass { use TraitA, TraitB { TraitB::doSomething as doSomethingFromB; // Pārsauc metodi no TraitB } public function callBoth() { $this->doSomething(); // Izsauks no TraitA pēc noklusējuma $this->doSomethingFromB(); // Izsauks pārsaukto metodi no TraitB } } $obj = new MyClass(); $obj->callBoth(); // Izvadīs "No TraitANo TraitB"Operators
asvar tikt izmantots kopā arinsteadofun ļauj mainīt metodes redzamību.<?php trait TraitA { private function internalMethod() { echo "Privāta no TraitA"; } } class MyClass { use TraitA { internalMethod as public externalMethod; // Pārsauc un padara publisku } } $obj = new MyClass(); $obj->externalMethod(); // Izvadīs "Privāta no TraitA" -
Skaidra metodes definēšana klasē: ja klase, kas izmanto trait, skaidri definē metodi ar to pašu nosaukumu, šī metode ir prioritāra pār trait metodēm.
<?php trait TraitA { public function doSomething() { echo "No TraitA"; } } trait TraitB { public function doSomething() { echo "No TraitB"; } } class MyClass { use TraitA, TraitB; public function doSomething() { // Klase definē savu metodi echo "No MyClass"; } } $obj = new MyClass(); $obj->doSomething(); // Izvadīs "No MyClass"
Bez skaidras risinājuma ar insteadof, as vai metodes pārrakstīšanu klasē, PHP izmetīs kļūdu E_STRICT, mēģinot izmantot klasi ar konfliktējošām trait metodēm.