Sobes.tech
Middle

İki trait eyni adlı metodlara malikdirsə, nə etmək lazımdır?

sobes.tech Süni İntellekt

AI-dan cavab

Traitlərdə metod adlarının toqquşması zamanı həll variantları mövcuddur:

  1. insteadof prefiks operatoru: Müəyyən bir trait-dən istifadə ediləcək metodu seçməyə imkan verir və digər trait-dən eyni adlı metodu nəzərə almır.

    <?php
    trait TraitA {
        public function doSomething() {
            echo "TraitA-dan";
        }
    }
    
    trait TraitB {
        public function doSomething() {
            echo "TraitB-dən";
        }
    }
    
    class MyClass {
        use TraitA, TraitB {
            TraitA::doSomething insteadof TraitB; // TraitA-dan metodu istifadə et
        }
    }
    
    $obj = new MyClass();
    $obj->doSomething(); // "TraitA-dan" göstərəcək
    

    Bir neçə istisna da göstərə bilərik:

    <?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. as prefiks operatoru: Münaqişəli metodlardan birinin adını dəyişməyə imkan verir.

    <?php
    trait TraitA {
        public function doSomething() {
            echo "TraitA-dan";
        }
    }
    
    trait TraitB {
        public function doSomething() {
            echo "TraitB-dən";
        }
    }
    
    class MyClass {
        use TraitA, TraitB {
            TraitB::doSomething as doSomethingFromB; // Metodu adlandırırıq
        }
    
        public function callBoth() {
            $this->doSomething();        // TraitA-dan olanı çağırır
            $this->doSomethingFromB(); // Yenidən adlandırılmış TraitB metodunu çağırır
        }
    }
    
    $obj = new MyClass();
    $obj->callBoth(); // "TraitA-danTraitB-dən" göstərəcək
    

    as operatoru insteadof ilə birlikdə istifadə oluna bilər və metodun görünürlüğünü dəyişməyə imkan verir.

    <?php
    trait TraitA {
        private function internalMethod() {
            echo "TraitA-dan daxili metod";
        }
    }
    
    class MyClass {
        use TraitA {
            internalMethod as public externalMethod; // Yenidən adlandır və ictimai et
        }
    }
    
    $obj = new MyClass();
    $obj->externalMethod(); // "TraitA-dan daxili metod" göstərəcək
    
  3. Açıq şəkildə metodun təyin edilməsi: Əgər trait-ləri istifadə edən sinif eyni adlı metodu açıq şəkildə təyin edərsə, bu metod trait metodlarından üstün olacaq.

    <?php
    trait TraitA {
        public function doSomething() {
            echo "TraitA-dan";
        }
    }
    
    trait TraitB {
        public function doSomething() {
            echo "TraitB-dən";
        }
    }
    
    class MyClass {
        use TraitA, TraitB;
    
        public function doSomething() { // Sinif öz metodunu təyin edir
            echo "MyClass-dan";
        }
    }
    
    $obj = new MyClass();
    $obj->doSomething(); // "MyClass-dan" göstərəcək
    

insteadof, as və ya sinifdə metodun açıq şəkildə yenidən təyin edilməsindən başqa, PHP konfliktli trait metodları ilə istifadə zamanı səhv E_STRICT verəcək.