Ինտերֆեյսների կիրառությունը OOP-ում PHP-ում

Այսպիսով, մենք արդեն պարզել ենք, որ ինտերֆեյսները լավ միջոց են դասի բոլոր անհրաժեշտ մեթոդների իրականացումը վերահսկելու համար:

Եկեք դիտարկենք մեկ այլ, ավելի գործնական օրինակ: Ենթադրենք, մենք ունենք մի դաս, որը պահելու է օբյեկտ-ձևերի զանգված.

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->addFigure(new Quadrate(2));
  $figuresCollection->addFigure(new Quadrate(3));
  
  // Ավելացնենք մի քանի ուղղանկյուն.
  $figuresCollection->addFigure(new Rectangle(2, 3));
  $figuresCollection->addFigure(new Rectangle(3, 4));
?>

Ցանկացած այլ դասի օբյեկտ ավելացնելու փորձը կհանգեցնի սխալի.

index.php<?php
  $figuresCollection = new FiguresCollection;
  
  class Test {}; // ինչ-որ այլ դաս
  $figuresCollection->addFigure(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 մեթոդը բոլոր ձևերի ընդհանուր պարագիծը գտնելու համար: