PHP में OOP ट्रेट्स के तरीकों के संघर्षों का समाधान

चूंकि एक वर्ग कई ट्रेट्स का उपयोग कर सकता है, इसलिए हमारे सामने एक समस्या आ सकती है, जब दो ट्रेट्स में एक ही नाम के तरीके हों।

इस स्थिति में PHP एक घातक त्रुटि देगा। स्थिति को सही करने के लिए, नामों के संघर्ष को स्पष्ट रूप से हल करना होगा। यह व्यवहार में कैसे किया जाता है - आइए अभ्यास में देखें।

मान लीजिए कि हमारे पास एक ही नाम के तरीके method वाले दो ट्रेट्स हैं:

php<?php
  trait Trait1
  {
    private function method()
    {
      return 1;
    }
  }
  
  trait Trait2
  {
    private function method()
    {
      return 2;
    }
  }
?>

मान लीजिए कि हमारे पास Test नामक एक वर्ग भी है, जो हमारे दोनों ट्रेट्स का उपयोग करता है। यदि बस हमारे वर्ग में दोनों ट्रेट्स को जोड़ दिया जाए, तो PHP एक त्रुटि देगा, क्योंकि ट्रेट्स में मेल खाने वाले तरीके हैं:

php<?php
  // यह कोड एक त्रुटि देगा!
  class Test
  {
    use Trait1, Trait2; // ट्रेट्स को कनेक्ट करें
  }
?>

आइए हम अपने ट्रेट्स के नामों के संघर्ष को हल करें। इसके लिए एक विशेष ऑपरेटर insteadof है। इस ऑपरेटर की सहायता से ट्रेट Trait2 के समान तरीके के बजाय ट्रेट Trait1 के तरीके method का उपयोग करेंगे:

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method insteadof Trait2;
    }
  }
  
  new Test;
?>

जैसा कि आप देख रहे हैं, यहाँ सिंटैक्स निम्नलिखित है: पहले ट्रेट का नाम, फिर दो कोलन, फिर तरीके का नाम, फिर हमारा ऑपरेटर insteadof और दूसरे ट्रेट का नाम।

आइए जाँच करें:

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method insteadof Trait2;
    }
    
    public function __construct()
    {
      echo $this->method(); // 1 प्रिंट करेगा, क्योंकि यह पहले ट्रेट का तरीका है
    }
  }
  
  new Test;
?>

तो, हमने अपने वर्ग में कहा कि यदि तरीका method उपयोग किया जाता है, तो इसे पहले ट्रेट से लेना चाहिए। इसके विपरीत भी किया जा सकता है - दूसरे ट्रेट का तरीका लें:

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait2::method insteadof Trait1;
    }
    
    public function __construct()
    {
      echo $this->method(); // 2 प्रिंट करेगा, क्योंकि यह दूसरे ट्रेट का तरीका है
    }
  }
  
  new Test;
?>

किसी भी स्थिति में, यदि हम एक ट्रेट के तरीके का उपयोग करने को निर्दिष्ट करते हैं, तो दूसरे ट्रेट का तरीका अनुपलब्ध हो जाता है। दूसरे ट्रेट के तरीके का भी उपयोग किया जा सकता है, इसे कीवर्ड as के माध्यम से नाम बदलकर, इस प्रकार:

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method insteadof Trait2;
      Trait2::method as method2;
    }
    
    public function __construct()
    {
      echo $this->method() + $this->method2(); // 3 प्रिंट करेगा
    }
  }
  
  new Test;
?>

इच्छा होने पर पहले ट्रेट के तरीके का नाम भी बदला जा सकता है:

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method insteadof Trait2;
      Trait1::method as method1;
      Trait2::method as method2;
    }
    
    public function __construct()
    {
      echo $this->method1() + $this->method2(); // 3 प्रिंट करेगा
    }
  }
  
  new Test;
?>

बिना insteadof के मुख्य तरीके को परिभाषित किए कीवर्ड as का उपयोग नहीं किया जा सकता, यह एक त्रुटि देगा:

php<?php
  // यह वर्ग एक त्रुटि देगा:
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method as method1;
      Trait2::method as method2;
    }
    
    public function __construct()
    {
      echo $this->method1() + $this->method2();
    }
  }
  
  new Test;
?>
Задание 1

3 ट्रेट्स बनाएं जिनके नाम Trait1, Trait2 और Trait3 हों। पहले ट्रेट में तरीका method हो, जो 1 लौटाता हो, दूसरे ट्रेट में - समान नाम का तरीका, जो 2 लौटाता हो, और तीसरे ट्रेट में - समान नाम का तरीका, जो 3 लौटाता हो।

Задание 2

Test नामक एक वर्ग बनाएं, जो हमारे द्वारा बनाए गए सभी तीन ट्रेट्स का उपयोग करता हो। इस वर्ग में तरीका getSum बनाएं, जो कनेक्ट किए गए ट्रेट्स के तरीकों के परिणामों का योग लौटाता हो।