Sąsajų taikymas OOP PHP
Taigi, jau išsiaiškinome, kad sąsajos yra geras būdas kontroliuoti, kad klasėje būtų įgyvendinti visi reikalingi metodai.
Panagrinėkime dar vieną, praktiškesnį, pavyzdį. Tarkime, turime klasę, kurioje bus saugomas objektų-figūrų masyvas:
<?php
class FiguresCollection
{
private $figures = []; // masyvas figūroms
}
?>
Įgyvendinkime mūsų klasėje metodą addFigure
objektų pridėjimui į kolekciją:
<?php
class FiguresCollection
{
private $figures = [];
// Parametru perduodamas objektas su figūra:
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
Akivaizdu, kad mes tikimės, kad
metodo addFigure parametru bus
perduodamas objektas su figūra. Tačiau tai
niekaip nekontroliuojama!
Naudokime tipų užuominą ir
aiškiai nurodykime objektų tipą kaip Figure:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
Išsiaiškinkime, ką mes padarėme.
Jei Figure būtų realiai egzistuojanti
klasė, tai į metodo parametrą galėtume
perduoti šios klasės objektus, taip pat ir
jos palikuonius.
Tačiau pas mus Figure yra sąsaja.
Tokiu atveju užuomina reiškia, kad
metodo parametru gali būti perduoti tik
mūsų sąsają įgyvendinančių klasių objektai.
Pabandykime sukurti mūsų klasės objektą ir į jį pridėti figūras:
<?php
$figuresCollection = new FiguresCollection;
// Pridėsime porą kvadratų:
$figuresCollection->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// Pridėsime porą stačiakampių:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
Bandymas pridėti bet kurios kitos klasės objektą sukels klaidą:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // kažkokia kita klasė
$figuresCollection->add(new Test); // išmes klaidą
?>
Ką praktiškai duoda mums toks kontroliavimas:
kadangi visos kolekcijoje esančios figūros
įgyvendina sąsają Figure, galime
būti tikri, kad kiekviena iš jų turės metodą
getSquare ir metodą
getPerimeter.
Galima ateityje, be kvadrato ir stačiakampio,
atsiranda, pavyzdžiui, dar ir trikampis. Šiuo
atveju ir trikampis taip pat turės
metodus getSquare ir
getPerimeter.
Praktiškai tai mums duoda štai ką: galime
klasėje FiguresCollection padaryti,
pavyzdžiui, metodą getTotalSquare, randantį
bendrą kolekcijos figūrų plotą. Šiame metode
mes ciklu perimsime figūrų masyvą ir
kiekvienai figūrai iškviestime
metodą getSquare.
Kadangi kiekviena figūra įgyvendina sąsają
Figure, galime būti 100%
tikri, kad kiekviena figūra turės
šį metodą getSquare.
Taigi, štai metodo realizacija:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
// Raskime bendrą plotą:
public function getTotalSquare()
{
$sum = 0;
foreach ($this->figures as $figure) {
$sum += $figure->getSquare(); // naudojame metodą getSquare
}
return $sum;
}
}
?>
Nežiūrėdami į mano kodą įgyvendinkite tokią
pačią klasę FiguresCollection.
Pridėkite į klasę FiguresCollection
metodą getTotalPerimeter, skirtą visų
figūrų bendram perimetrui rasti.