PHP में OOP केवल पढ़ने के लिए गुण

आइए एक ऐसे वर्ग पर विचार करें जिसमें सभी गुण निजी हैं:

Test.php<?php
  class Test
  {
    private $prop1 = 1;
    private $prop2 = 2;
  }
?>

अब हम इसे इस प्रकार बनाते हैं कि ये गुण बाहरी दुनिया में केवल पढ़ने के लिए उपलब्ध हों। हमने पहले भी ऐसा किया था, प्रत्येक गुण के लिए गेटर्स बनाकर और सेटर्स नहीं बनाकर।

आइए अब इस कार्य को हल करने के लिए जादुई विधि __get का उपयोग करें। हम इसमें अनुरोध किए गए गुण का मान वापस करेंगे। इसे कैसे करें: अनुरोध किए गए गुण का नाम विधि के पैरामीटर __get में चला जाता है, हमारे मामले में $property।

इसका मतलब है कि हम उस गुण को पढ़ सकते हैं, जिसका नाम चर में संग्रहीत है, इस प्रकार: $this->$property (गुण का नाम एक चर होगा, यानी शुरुआत में डॉलर के साथ, हम ने इसे पिछले पाठों में पढ़ा है)।

आइए वर्णित विधि __get बनाएं:

Test.php<?php
  class Test
  {
    private $prop1 = 1;
    private $prop2 = 2;
    
    public function __get($property)
    {
      return $this->$property;
    }
  }
?>

आइए गुणों को पढ़ने के लिए इसका उपयोग करें:

index.php<?php
  $test = new Test;
  
  echo $test->prop1; // 1 प्रदर्शित करेगा
  echo $test->prop2; // 2 प्रदर्शित करेगा
?>

किसी गुण में कुछ लिखने का प्रयास त्रुटि उत्पन्न करेगा:

php<?php
  $test = new Test;
  $test->prop1 = 2; // त्रुटि देगा
?>

यह वही है जो हमें चाहिए: गुण को पढ़ा जा सकता है, लेकिन लिखा नहीं जा सकता।

किसी अस्तित्वहीन गुण को पढ़ने का प्रयास त्रुटि उत्पन्न करेगा:

php<?php
  $test = new Test;
  echo $test->prop3; // त्रुटि देगा
?>

कृपया निम्नलिखित बारीकियों पर भी ध्यान दें: जब हम केवल पढ़ने के लिए गुण बना रहे थे पुराने तरीके से, तो गुण को पढ़ने के लिए हमने एक विधि-गेटर का उपयोग किया था।

नए तरीके में, हम सीधे गुणों को ही संदर्भित करेंगे, मानो वे सार्वजनिक हों। लेकिन उनमें कुछ भी लिख नहीं सकेंगे, मानो वे निजी हों।

Задание 1

मान लीजिए कि एक वर्ग User दिया गया है, जिसके गुण गेटर्स का उपयोग करके केवल पढ़ने के लिए उपलब्ध हैं:

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

इस वर्ग के कोड को इस प्रकार बदलें कि गेटर्स के स्थान पर जादुई विधि __get का उपयोग किया जाए।