Toepassing van interfaces in OOP in PHP
We hebben dus al vastgesteld dat interfaces een goede manier zijn om te controleren of alle noodzakelijke methoden van een klas zijn geïmplementeerd.
Laten we nog een, meer praktisch, voorbeeld bekijken. Stel dat we een klasse hebben die een array van object-vormen zal bevatten:
<?php
class FiguresCollection
{
private $figures = []; // array voor vormen
}
?>
Laten we in onze klasse de methode addFigure
implementeren om objecten aan de collectie toe te voegen:
<?php
class FiguresCollection
{
private $figures = [];
// Een object met een vorm wordt als parameter doorgegeven:
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
Het is duidelijk dat we ervan uitgaan dat
er een object met een vorm als parameter van de methode addFigure wordt
doorgegeven. Er is echter geen controle op!
Laten we een typehint gebruiken en
expliciet het type objecten opgeven als Figure:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
Laten we eens kijken wat we hebben gedaan.
Als Figure een daadwerkelijk bestaande
klasse was, dan zouden we in de parametermethode
objecten van deze klasse kunnen doorgeven, en ook
zijn erfgenamen.
Bij ons is Figure echter een interface.
In dat geval betekent de hint dat
alleen objecten van klassen die onze interface implementeren, als methodeparameter kunnen worden doorgegeven.
Laten we proberen een object van onze klasse te maken en er vormen aan toe te voegen:
<?php
$figuresCollection = new FiguresCollection;
// Laten we een paar vierkanten toevoegen:
$figuresCollection->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// Laten we een paar rechthoeken toevoegen:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
Een poging om een object van een andere klasse toe te voegen, zal resulteren in een fout:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // een andere klasse
$figuresCollection->add(new Test); // geeft een foutmelding
?>
Wat geeft ons zo'n controle in de praktijk:
omdat alle vormen die aan de collectie zijn toegevoegd,
de interface Figure implementeren, kunnen we
er zeker van zijn dat elk van hen de methode
getSquare en de methode
getPerimeter zal hebben.
In de toekomst kan er, naast vierkant en rechthoek,
bijvoorbeeld ook een driehoek verschijnen. In
dat geval zal de driehoek ook
de methoden getSquare en
getPerimeter hebben.
In de praktijk geeft ons dit het volgende: we kunnen
in de klasse FiguresCollection bijvoorbeeld
de methode getTotalSquare maken, die
de totale oppervlakte van de vormen in de collectie vindt. In deze methode
zullen we de array van vormen doorlopen met een lus en
bij elke vorm de
methode getSquare aanroepen.
Omdat elke vorm de interface
Figure implementeert, kunnen we voor 100%
zeker zijn dat elke vorm
deze methode getSquare zal hebben.
Hier is de implementatie van de methode:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
// Laten we de totale oppervlakte vinden:
public function getTotalSquare()
{
$sum = 0;
foreach ($this->figures as $figure) {
$sum += $figure->getSquare(); // gebruiken de methode getSquare
}
return $sum;
}
}
?>
Zonder in mijn code te kijken, implementeert u een
dergelijke klasse FiguresCollection.
Voeg aan de klasse FiguresCollection
de methode getTotalPerimeter toe om
de totale omtrek van alle vormen te vinden.