⊗ppOpIfAp 68 of 107 menu

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.

Nederlands
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Wij gebruiken cookies voor de werking van de site, analyse en personalisatie. De verwerking van gegevens gebeurt volgens het Privacybeleid.
alles accepteren aanpassen weigeren