Die Toepassing van Koppelvlakke in OOP in PHP
So, ons het reeds vasgestel dat koppelvlakke 'n goeie manier is om te beheer dat al die nodige klasmetodes geïmplementeer is.
Kom ons kyk na nog 'n, meer praktiese, voorbeeld. Laat ons sê ons het 'n klas wat 'n versameling van voorwerpe-vorms sal stoor:
<?php
class FiguresCollection
{
private $figures = []; // array vir vorms
}
?>
Laat ons die metode addFigure
implementeer om voorwerpe by die versameling te voeg:
<?php
class FiguresCollection
{
private $figures = [];
// 'n Voorwerp met 'n vorm word as parameter oorgedra:
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
Dit is duidelik dat ons verwag dat
die parameter van die metode addFigure
'n voorwerp met 'n vorm sal wees. Daar is egter
geen beheer hieroor nie!
Kom ons gebruik 'n tipewenking en
duidelik die tipe voorwerpe as Figure spesifiseer:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
Kom ons kyk na wat ons gedoen het.
As Figure 'n werklik bestaande
klas was, sou ons voorwerpe van daardie klas, asook
die erfgename daarvan, in die metodeparameter kon oordra.
By ons is Figure egter 'n koppelvlak.
In hierdie geval beteken die wenking dat
slegs voorwerpe van klasse wat ons koppelvlak implementeer,
as metodeparameter oorgedra kan word.
Kom ons probeer om 'n voorwerp van ons klas te skep en vorms daaraan toe te voeg:
<?php
$figuresCollection = new FiguresCollection;
// Laat ons 'n paar vierkante byvoeg:
$figuresCollection->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// Laat ons 'n paar reghoeke byvoeg:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
'n Poging om 'n voorwerp van enige ander klas by te voeg, sal tot 'n fout lei:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // een of ander ander klas
$figuresCollection->add(new Test); // sal 'n fout gee
?>
Wat gee hierdie beheer vir ons in die praktyk:
aangesien alle vorms wat by die versameling gevoeg word,
die koppelvlak Figure implementeer, kan ons
seker wees dat elkeen van hulle die metode
getSquare en die metode
getPerimeter sal hê.
Miskien sal daar in die toekoms behalwe vierkant en reghoek
byvoorbeeld ook 'n driehoek wees. In
hierdie geval sal die driehoek ook die
metodes getSquare en
getPerimeter hê.
In die praktyk gee dit vir ons die volgende: ons kan
in die klas FiguresCollection byvoorbeeld
die metode getTotalSquare maak, wat die
totale oppervlakte van die versamelingsvorms vind. In hierdie metode
sal ons deur die vorms-array sirkuleer en
by elke vorm die
metode getSquare aanroep.
Aangesien elke vorm die koppelvlak
Figure implementeer, kan ons 100%
seker wees dat elke vorm
hierdie metode getSquare sal hê.
So, hier is die implementering van die metode:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
// Laat ons die totale oppervlakte vind:
public function getTotalSquare()
{
$sum = 0;
foreach ($this->figures as $figure) {
$sum += $figure->getSquare(); // gebruik die metode getSquare
}
return $sum;
}
}
?>
Sonder om na my kode te kyk, implementeer 'n soortgelyke
klas FiguresCollection.
Voeg by die klas FiguresCollection
die metode getTotalPerimeter by om die
totale omtrek van alle vorms te vind.