Ինտերֆեյսների կիրառությունը OOP-ում PHP-ում
Այսպիսով, մենք արդեն պարզել ենք, որ ինտերֆեյսները լավ միջոց են դասի բոլոր անհրաժեշտ մեթոդների իրականացումը վերահսկելու համար:
Եկեք դիտարկենք մեկ այլ, ավելի գործնական օրինակ: Ենթադրենք, մենք ունենք մի դաս, որը պահելու է օբյեկտ-ձևերի զանգված.
<?php
class FiguresCollection
{
private $figures = []; // զանգված ձևերի համար
}
?>
Եկեք իրականացնենք մեր դասում addFigure
մեթոդը օբյեկտները հավաքածուում ավելացնելու համար.
<?php
class FiguresCollection
{
private $figures = [];
// Պարամետրով փոխանցվում է օբյեկտ ձևով.
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
Ակնհայտ է, որ մենք հաշվում ենք, որ
addFigure մեթոդի պարամետրով կփոխանցվի
օբյեկտ ձևով: Սակայն դրա համար չկա որևէ վերահսկողություն:
Եկեք օգտագործենք տիպերի համար հուշում և
բացահայտ նշենք օբյեկտների տիպը որպես Figure.
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
Եկեք հասկանանք, թե ինչ ենք մենք արել:
Եթե Figure իրականում գոյություն ունեցող
դաս լիներ, ապա մեթոդի պարամետրին մենք կկարողանայինք
փոխանցել այդ դասի օբյեկտները, և նաև
դրա ժառանգները:
Սակայն մեր դեպքում Figure-ը ինտերֆեյս է:
Այս դեպքում հուշումը նշանակում է, որ
մեթոդի պարամետրին կարող են փոխանցվել միայն
մեր ինտերֆեյսն իրականացնող դասերի օբյեկտները:
Եկեք փորձենք ստեղծել մեր դասի օբյեկտը և ավելացնել դրանում ձևեր.
<?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));
?>
Ցանկացած այլ դասի օբյեկտ ավելացնելու փորձը կհանգեցնի սխալի.
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // ինչ-որ այլ դաս
$figuresCollection->addFigure(new Test); // կտա սխալ
?>
Ինչ է գործնականում տալիս մեզ նման վերահսկողությունը.
քանի որ հավաքածուում ավելացված բոլոր ձևերը
իրականացնում են Figure ինտերֆեյսը, մենք կարող ենք
վստահ լինել, որ դրանցից յուրաքանչյուրն ունի getSquare մեթոդը
և getPerimeter մեթոդը:
Հնարավոր է, որ ապագայում քառակուսուց և ուղղանկյունից բացի
հայտնվի, օրինակ, նաև եռանկյուն:
Այս դեպքում եռանկյունը նույնպես կունենա
getSquare և
getPerimeter մեթոդները:
Գործնականում սա մեզ տալիս է հետևյալը. մենք կարող ենք
FiguresCollection դասում ստեղծել,
օրինակ, getTotalSquare մեթոդը, որը գտնում է
հավաքածուի ձևերի ընդհանուր մակերեսը: Այս մեթոդում
մենք կփնտրենք ցիկլով ձևերի զանգվածը և
յուրաքանչյուր ձևի համար կկանչենք
getSquare մեթոդը:
Քանի որ յուրաքանչյուր ձև իրականացնում է Figure
ինտերֆեյսը, մենք կարող ենք 100%
վստահ լինել, որ յուրաքանչյուր ձև կունենա
getSquare մեթոդը:
Այսպիսով, ահա մեթոդի իրականացումը.
<?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;
}
}
?>
Չնայելով իմ կոդին, իրականացրեք նույն
FiguresCollection դասը:
Ավելացրեք FiguresCollection դասում
getTotalPerimeter մեթոդը բոլոր ձևերի
ընդհանուր պարագիծը գտնելու համար: