Примена интерфејса у ООП у 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->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// Додајмо пар правоугаоника:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
Покушај да се дода објекат неке друге класе ће довести до грешке:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // нека друга класа
$figuresCollection->add(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 за проналажење
укупног обима свих фигура.