Matumizi ya Interfaces katika OOP katika PHP
Kwa hivyo, tumeona kwamba interfaces ni njia nzuri ya kudhibiti kuwa mbinu zote muhimu za darasa zimetekelezwa.
Wacha tuchunguze mfano mwingine, unaotumika zaidi katika mazoezi. Tuchukulie tuna darasa ambalo litahifadhi safu ya vitu maumbo:
<?php
class FiguresCollection
{
private $figures = []; // safu ya maumbo
}
?>
Wacha tutekeleze katika darasa letu mbinu addFigure
ya kuongeza vitu kwenye mkusanyiko:
<?php
class FiguresCollection
{
private $figures = [];
// Kigezo hupeanwa kitu cha umbo:
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
Ni wazi kabisa kwamba tunategemea kuwa
kigezo cha mbinu addFigure kitapeanwa
kitu chenye umbo. Hata hivyo, hakuna udhibiti
wowote wa hili!
Wacha tutumie kidokezo cha aina na
tubainishe wazi aina ya vitu kama Figure:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
Wacha tuchambue kile tulichofanya.
Kama Figure ungekuwa darasa uliopo
kwa kweli, basi kwenye kigezo cha mbinu tungeweza
kupeana vitu vya darasa hilo, na pia
warithi wake.
Kwetu, hata hivyo, Figure ni interface.
Katika kesi hiyo kidokezo kinaonyesha kuwa
kigezo cha mbinu kinaweza tu kupeanwa
vitu vya darasa ambavyo vinatekeleza interface yetu.
Wacha tujaribu kuunda kitu cha darasa letu na kuongeza maumbo ndani yake:
<?php
$figuresCollection = new FiguresCollection;
// Ongeze miraba michache:
$figuresCollection->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// Ongeze mistatili michache:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
Jaribio la kuongeza kitu la darasa lingine lolote litasababisha hitilafu:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // darasa lingine fulani
$figuresCollection->add(new Test); // itatoa hitilafu
?>
Kwa mazoezi udhibiti kama huu unatupa nini:
kwa kuwa maumbo yote yaliyoongezwa kwenye mkusanyiko,
yanatekeleza interface Figure, tunaweza
kuwa na uhakika, kwamba kila mmoja wao utakuwa na mbinu
getSquare na mbinu
getPerimeter.
Yamkini baadaye badala ya mraba na mstatili
itakuja, kwa mfano, pia pembetatu. Katika
kesi hiyo na pembetatu pia itakuwa na
mbinu getSquare na
getPerimeter.
Kwa mazoezi hii inatupa yafuatayo: tunaweza
katika darasa FiguresCollection kutengeneza,
kwa mfano, mbinu getTotalSquare, inayopata
eneo jumla la maumbo ya mkusanyiko. Katika mbinu hii
tutakwenda kupitia safu ya maumbo kwa mzunguko na
kwa kila umbo kuita
mbinu getSquare.
Kwa kuwa kila umbo linatekeleza interface
Figure, tunaweza kuwa na uhakika wa 100%
katika kwamba, kila umbo kitakuwa na
mbinu hii getSquare.
Kwa hivyo, hapa kuna utekelezaji wa mbinu:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
// Tupate eneo jumla:
public function getTotalSquare()
{
$sum = 0;
foreach ($this->figures as $figure) {
$sum += $figure->getSquare(); // tunatumia mbinu getSquare
}
return $sum;
}
}
?>
Bila kuangalia kwenye msimbo wangu utekeleze darasa
kama hilo FiguresCollection.
Ongeza katika darasa FiguresCollection
mbinu getTotalPerimeter ya kupata
mzingo jumla wa maumbo yote.