Примена на интерфејси во ООП во 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 за наоѓање на
вкупниот периметар на сите форми.