Sobes.tech
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:

  1. 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;
        }
    }
    
  2. 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 as var tikt izmantots kopā ar insteadof un ļ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"
    
  3. 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.