Përdorimi i Interfejseve në OOP në PHP
Pra, ne kemi zbuluar tashmë se interfejsat janë një mënyrë e mirë për të kontrolluar që të gjitha metodat e nevojshme të klasës të jenë të implementuara.
Le të shqyrtojmë një shembull tjetër, më praktik. Supozoni se kemi një klasë që do të ruajë në vetvete një grup objektesh-forma:
<?php
class FiguresCollection
{
private $figures = []; // grup për format
}
?>
Le të implementojmë në klasën tonë metodën addFigure
për shtimin e objekteve në koleksion:
<?php
class FiguresCollection
{
private $figures = [];
// Si parametër transmetohet një objekt me formë:
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
Është e qartë se ne po supozojmë që
si parametër i metodës addFigure
do të transmetohet një objekt me formë. Megjithatë,
nuk ka asnjë kontroll për këtë!
Le të përdorim një sugjerim për llojet dhe
të specifikojmë në mënyrë eksplicite llojin e objekteve si Figure:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
Le të kuptojmë se çfarë kemi bërë.
Nëse Figure do të ishte një klasë ekzistuese
realisht, atëherë në parametrin e metodës ne do të mund të
transmetonim objekte të asaj klase, si dhe
trashëgimtarët e saj.
Te ne, megjithatë, Figure është një interfejs.
Në këtë rast, sugjerimi tregon që
si parametër të metodës mund të transmetohen vetëm
objekte të klasave që implementojnë interfejsin tonë.
Le të përpiqemi të krijojmë një objekt të klasës sonë dhe të shtojmë në të forma:
<?php
$figuresCollection = new FiguresCollection;
// Le të shtojmë disa katrorë:
$figuresCollection->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// Le të shtojmë disa drejtkëndësha:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
Përpjekja për të shtuar një objekt të ndonjë klase tjetër do të çojë në gabim:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // ndonjë klasë tjetër
$figuresCollection->add(new Test); // do të japë gabim
?>
Çfarë në praktikë na jep një kontroll të tillë:
meqenëse të gjitha format, të shtuara në koleksion,
implementojnë interfejsin Figure, ne mund të
jemi të sigurt se secila prej tyre do të ketë metodën
getSquare dhe metodën
getPerimeter.
Është e mundur që në të ardhmen përveç katrorit dhe drejtkëndëshit
të shfaqet, për shembull, edhe një trekëndësh. Në
këtë rast edhe trekëndëshi do të ketë
metodat getSquare dhe
getPerimeter.
Në praktikë kjo na jep sa vijon: ne mund
në klasën FiguresCollection të bëjmë,
për shembull, metodën getTotalSquare, që gjen
sipërfaqen totale të formave të koleksionit. Në këtë metodë
ne do të përsërisim me cikël grupin e formave dhe
secilës forme do t'i thirrim
metodën getSquare.
Meqenëse çdo formë implementon interfejsin
Figure, ne mund të jemi 100%
të sigurt në atë që çdo formë do të ketë
këtë metodë getSquare.
Pra, ja implementimi i metodës:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
// Le të gjejmë sipërfaqen totale:
public function getTotalSquare()
{
$sum = 0;
foreach ($this->figures as $figure) {
$sum += $figure->getSquare(); // përdorim metodën getSquare
}
return $sum;
}
}
?>
Pa parë në kodin tim, implementoni të njëjtën
klasë FiguresCollection.
Shtoni në klasën FiguresCollection
metodën getTotalPerimeter për gjetjen
e perimetrit total të të gjitha formave.