Sobes.tech
Middle

İki trait aynı ada sahip bir metoda sahipse ne yapılmalı?

sobes.tech yapay zeka

AI'dan gelen yanıt

Traits'taki metod isim çatışmaları durumunda birkaç çözüm seçeneği vardır:

  1. insteadof öneki operatörü: Belirli bir trait'ten kullanılacak yöntemi seçmeye olanak tanır ve diğer trait'ten aynı isimli yöntemi yoksayar.

    <?php
    trait TraitA {
        public function doSomething() {
            echo "TraitA'dan";
        }
    }
    
    trait TraitB {
        public function doSomething() {
            echo "TraitB'den";
        }
    }
    
    class MyClass {
        use TraitA, TraitB {
            TraitA::doSomething insteadof TraitB; // TraitA'dan yöntemi kullan
        }
    }
    
    $obj = new MyClass();
    $obj->doSomething(); // "TraitA'dan" yazdırır
    

    Birden fazla istisna belirtilebilir:

    <?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 öneki operatörü: Çakışan metodlardan birinin yeniden adlandırılmasına olanak tanır.

    <?php
    trait TraitA {
        public function doSomething() {
            echo "TraitA'dan";
        }
    }
    
    trait TraitB {
        public function doSomething() {
            echo "TraitB'den";
        }
    }
    
    class MyClass {
        use TraitA, TraitB {
            TraitB::doSomething as doSomethingFromB; // Yöntemi yeniden adlandır
        }
    
        public function callBoth() {
            $this->doSomething();        // TraitA'dan olanı çağırır
            $this->doSomethingFromB(); // Yeniden adlandırılan TraitB yöntemi
        }
    }
    
    $obj = new MyClass();
    $obj->callBoth(); // "TraitA'danTraitB'den" yazdırır
    

    as operatörü, insteadof ile birlikte kullanılabilir ve yöntemin görünürlüğünü değiştirmeye olanak tanır.

    <?php
    trait TraitA {
        private function internalMethod() {
            echo "TraitA'dan özel yöntem";
        }
    }
    
    class MyClass {
        use TraitA {
            internalMethod as public externalMethod; // Yeniden adlandır ve genel yap
        }
    }
    
    $obj = new MyClass();
    $obj->externalMethod(); // "TraitA'dan özel yöntem" yazdırır
    
  3. Sınıfta açıkça tanımlanan yöntem: Trait kullanan sınıf, aynı isimde açıkça tanımlanmış bir yöntem belirlerse, bu yöntem trait'lerin yöntemleri üzerinde öncelik kazanır.

    <?php
    trait TraitA {
        public function doSomething() {
            echo "TraitA'dan";
        }
    }
    
    trait TraitB {
        public function doSomething() {
            echo "TraitB'den";
        }
    }
    
    class MyClass {
        use TraitA, TraitB;
    
        public function doSomething() { // Sınıf kendi yöntemini tanımlar
            echo "MyClass'dan";
        }
    }
    
    $obj = new MyClass();
    $obj->doSomething(); // "MyClass'dan" yazdırır
    

insteadof, as veya sınıfta yöntem yeniden tanımlaması kullanmadan, PHP çakışan trait metodlarıyla sınıf kullanımı sırasında hata E_STRICT verir.