PHP में OOP में इंटरफेस का उपयोग

तो, हमने पहले ही स्पष्ट कर दिया है कि इंटरफेस एक अच्छा तरीका है यह नियंत्रित करने के लिए कि कक्षा की सभी आवश्यक विधियों को लागू किया गया है।

आइए एक और, अधिक व्यावहारिक उदाहरण देखें। मान लीजिए कि हमारे पास एक कक्षा है, जो वस्तुओं-आकृतियों की एक सरणी को संग्रहीत करेगी:

FiguresCollection.php<?php
  class FiguresCollection
  {
    private $figures = []; // आकृतियों के लिए सरणी
  }
?>

आइए हमारी कक्षा में वस्तुओं को संग्रह में जोड़ने के लिए addFigure विधि को लागू करें:

FiguresCollection.php<?php
  class FiguresCollection
  {
    private $figures = [];
    
    // पैरामीटर के रूप में एक आकृति वाली वस्तु पास की जाती है:
    public function addFigure($figure)
    {
      $this->figures[] = $figure;
    }
  }
?>

जाहिर है, हम इस बात पर भरोसा कर रहे हैं कि addFigure विधि के पैरामीटर के रूप में एक आकृति वाली वस्तु पास की जाएगी। हालाँकि, इसका कोई नियंत्रण नहीं है!

आइए प्रकारों के लिए संकेत का उपयोग करें और स्पष्ट रूप से वस्तुओं का प्रकार Figure के रूप में निर्दिष्ट करें:

FiguresCollection.php<?php
  class FiguresCollection
  {
    private $figures = [];
    
    public function addFigure(Figure $figure)
    {
      $this->figures[] = $figure;
    }
  }
?>

आइए समझते हैं कि हमने क्या किया।

अगर Figure एक वास्तव में मौजूदा कक्षा होती, तो विधि के पैरामीटर में हम इस कक्षा की वस्तुओं के साथ-साथ इसके उत्तराधिकारियों की वस्तुओं को भी पास कर सकते थे।

हालाँकि, हमारे मामले में Figure एक इंटरफेस है। ऐसे में संकेत यह दर्शाता है कि विधि के पैरामीटर में केवल उन्हीं कक्षाओं की वस्तुओं को पास किया जा सकता है, जो हमारे इंटरफेस को लागू करती हैं।

आइए हमारी कक्षा की एक वस्तु बनाने और उसमें आकृतियाँ जोड़ने का प्रयास करें:

index.php<?php
  $figuresCollection = new FiguresCollection;
  
  // दो वर्ग जोड़ेंगे:
  $figuresCollection->add(new Quadrate(2));
  $figuresCollection->add(new Quadrate(3));
  
  // दो आयत जोड़ेंगे:
  $figuresCollection->add(new Rectangle(2, 3));
  $figuresCollection->add(new Rectangle(3, 4));
?>

किसी अन्य कक्षा की वस्तु जोड़ने का प्रयास त्रुटि का कारण बनेगा:

index.php<?php
  $figuresCollection = new FiguresCollection;
  
  class Test {}; // कोई अन्य कक्षा
  $figuresCollection->add(new Test); // त्रुटि देगा
?>

व्यवहार में यह नियंत्रण हमें क्या देता है: चूंकि संग्रह में जोड़ी गई सभी आकृतियां Figure इंटरफेस को लागू करती हैं, हम आश्वस्त हो सकते हैं कि उनमें से प्रत्येक में getSquare विधि और getPerimeter विधि होगी।

संभव है कि भविष्य में वर्ग और आयत के अलावा उदाहरण के लिए, एक त्रिकोण भी आ जाए। इस मामले में त्रिकोण में भी getSquare और getPerimeter विधियां होंगी।

व्यवहार में यह हमें निम्नलिखित देता है: हम FiguresCollection कक्षा में, उदाहरण के लिए, getTotalSquare विधि बना सकते हैं, जो संग्रह की आकृतियों का कुल क्षेत्रफल ज्ञात करती है। इस विधि में हम आकृतियों की सरणी को लूप से पार करेंगे और प्रत्येक आकृति में getSquare विधि को कॉल करेंगे।

चूंकि प्रत्येक आकृति Figure इंटरफेस को लागू करती है, हम 100% आश्वस्त हो सकते हैं कि प्रत्येक आकृति में यह getSquare विधि होगी।

तो, विधि का कार्यान्वयन यहां है:

php<?php
  class FiguresCollection
  {
    private $figures = [];
    
    public function addFigure(Figure $figure)
    {
      $this->figures[] = $figure;
    }
    
    // कुल क्षेत्रफल ज्ञात करेंगे:
    public function getTotalSquare()
    {
      $sum = 0;
      
      foreach ($this->figures as $figure) {
        $sum += $figure->getSquare(); // getSquare विधि का उपयोग करते हैं
      }
      
      return $sum;
    }
  }
?>
Задание 1

मेरे कोड में झांके बिना ऐसी ही FiguresCollection कक्षा को लागू करें।

Задание 2

FiguresCollection कक्षा में सभी आकृतियों का कुल परिमाप ज्ञात करने के लिए getTotalPerimeter विधि जोड़ें।