Sobes.tech
Middle

რა უნდა გავაკეთოთ, თუ ორი trait-ს აქვს ერთნაირი სახელის მეთოდი?

sobes.tech AI

პასუხი AI-სგან

کله چې د میتودونو نومونه په traits کې ټکر وکړي، د حل لپاره څو لارې شتون لري:

  1. insteadof پیشوند عملیاتګر: دا اجازه ورکوي چې د مشخص شوي trait څخه میتود وټاکئ، چې د بل trait څخه د ورته نوم میتود له پامه غورځوي.

    <?php
    trait TraitA {
        public function doSomething() {
            echo "له TraitA";
        }
    }
    
    trait TraitB {
        public function doSomething() {
            echo "له TraitB";
        }
    }
    
    class MyClass {
        use TraitA, TraitB {
            TraitA::doSomething insteadof TraitB; // د TraitA میتود کاروو
        }
    }
    
    $obj = new MyClass();
    $obj->doSomething(); // "له TraitA" چاپ کوي
    

    کولی شئ څو استثناوې هم وټاکئ:

    <?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 پیشوند عملیاتګر: دا اجازه ورکوي چې د ټکر لرونکي میتود یو نوم بدل کړئ:

    <?php
    trait TraitA {
        public function doSomething() {
            echo "له TraitA";
        }
    }
    
    trait TraitB {
        public function doSomething() {
            echo "له TraitB";
        }
    }
    
    class MyClass {
        use TraitA, TraitB {
            TraitB::doSomething as doSomethingFromB; // د TraitB میتود نوم بدلول
        }
    
        public function callBoth() {
            $this->doSomething(); // د TraitA میتود غږوي
            $this->doSomethingFromB(); // د بدل شوي میتود غږول
        }
    }
    
    $obj = new MyClass();
    $obj->callBoth(); // "له TraitAله TraitB" چاپ کوي
    

    د as عملیاتګر د insteadof سره په ګډه کارول کیدی شي او د میتود لیدتیا بدلوي:

    <?php
    trait TraitA {
        private function internalMethod() {
            echo "د TraitA شخصي میتود";
        }
    }
    
    class MyClass {
        use TraitA {
            internalMethod as public externalMethod; // بدلول او عام کول
        }
    }
    
    $obj = new MyClass();
    $obj->externalMethod(); // "د TraitA شخصي میتود" چاپ کوي
    
  3. په کلاس کې واضح تعریف شوی میتود: که کلاس چې traits کاروي، په صراحت سره د همدې نوم میتود تعریف کړي، دا میتود د traits میتودونو پر ځای ترجیح لري:

    <?php
    trait TraitA {
        public function doSomething() {
            echo "له TraitA";
        }
    }
    
    trait TraitB {
        public function doSomething() {
            echo "له TraitB";
        }
    }
    
    class MyClass {
        use TraitA, TraitB;
    
        public function doSomething() { // د کلاس خپل میتود
            echo "له MyClass";
        }
    }
    
    $obj = new MyClass();
    $obj->doSomething(); // "له MyClass" چاپ کوي
    

بې له دې چې د insteadof یا as کارولو سره حل شي، یا د میتود بیا تعریفولو سره، PHP به تېروتنه E_STRICT وښيي کله چې د traits د متضاد میتودونو سره کلاس کارول هڅه وشي.