PHP में OOP के ट्रेट्स

जैसा कि आप पहले से ही जानते हैं, PHP में एक साथ कई क्लासेज से इनहेरिट नहीं किया जा सकता, सिर्फ एक से ही किया जा सकता है। इस समस्या का समाधान हम पहले ही पढ़ चुके हैं: इनहेरिटेंस के बजाय दूसरी क्लासेज के ऑब्जेक्ट्स का उपयोग एक दूसरे के अंदर करना।

PHP में इसका एक और तरीका है। यह ट्रेट्स के उपयोग में निहित है। एक ट्रेट उन प्रॉपर्टीज और मेथड्स का एक सेट होता है, जिन्हें किसी अन्य क्लास में शामिल किया जा सकता है। ऐसा करने पर ट्रेट की प्रॉपर्टीज और मेथड्स को क्लास द्वारा अपने स्वयं के जैसे ही समझा जाएगा।

ट्रेट का सिंटैक्स क्लास के समान ही होता है, इसके अलावा कि ट्रेट का नाम कीवर्ड trait का उपयोग करके घोषित करना होता है।

ट्रेट का एक उदाहरण (instance) नहीं बनाया जा सकता - ट्रेट्स केवल अन्य क्लासेज से जोड़ने के लिए होते हैं। जोड़ना use कमांड का उपयोग करके किया जाता है, जिसके बाद एक स्पेस के through जुड़े जाने वाले ट्रेट का नाम निर्दिष्ट किया जाता है। यह कमांड क्लास की शुरुआत में लिखी जाती है।

आइए एक व्यावहारिक उदाहरण पर ट्रेट्स के अनुप्रयोग को देखें। मान लीजिए कि हमें Helper नाम का एक ट्रेट दिया गया है, जिसमें प्राइवेट प्रॉपर्टीज name और age, और उनके गेटर्स हैं:

Helper.php<?php
  trait Helper
  {
    private $name;
    private $age;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function getAge()
    {
      return $this->age;
    }
  }
?>

मान लीजिए कि हमारे पास User नाम का एक क्लास भी है, जिसके कंस्ट्रक्टर में प्रॉपर्टीज name और age सेट की जाती हैं:

User.php<?php
  class User
  {
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

आइए अब हम अपने User क्लास की प्रॉपर्टीज के लिए गेटर्स जोड़ें। केवल इन्हें क्लास के अंदर नहीं लिखेंगे, बल्कि सिर्फ Helper ट्रेट को कनेक्ट कर देंगे, जिसमें ये मेथड्स पहले से ही इम्प्लीमेंटेड हैं:

User.php<?php
  class User
  {
    use Helper; // ट्रेट को कनेक्ट करें
    
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

ट्रेट को कनेक्ट करने के बाद, हमारी क्लास में उस ट्रेट की मेथड्स और प्रॉपर्टीज आ जाएंगी। ऐसा करने पर हम उन्हें क्लास की अपनी मेथड्स और प्रॉपर्टीज की तरह ही एक्सेस करेंगे:

index.php<?php
  $user = new User('john', 30);
  echo $user->getName(); // 'john' प्रिंट करेगा
  echo $user->getAge();  // 30 प्रिंट करेगा
?>
Задание 1

City क्लास को इम्प्लीमेंट करें जिसमें प्रॉपर्टीज name, age, population और उनके लिए गेटर्स हों। हमारी क्लास अपने कोड को छोटा करने के लिए पहले से बनाए गए ट्रेट Helper का उपयोग करे।