Interfeisu pielietojums OOP PHP
Tātad, mēs jau esam noskaidrojuši, ka interfeisi ir labs veids, kā kontrolēt, ka visas nepieciešamās klases metodes ir realizētas.
Apskatīsim vēl vienu, praktiskāku, piemēru. Pieņemsim, ka mums ir klase, kurā tiks glabāts objektu - ģeometrisko formu masīvs:
<?php
class FiguresCollection
{
private $figures = []; // masīvs formām
}
?>
Realizēsim mūsu klasē metodi addFigure
objektu pievienošanai kolekcijā:
<?php
class FiguresCollection
{
private $figures = [];
// Parametrā tiek padots objekts ar formu:
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
Acīmredzot, mēs rēķināmies ar to, ka
metodes addFigure parametrā tiks
padots objekts ar ģeometrisko formu. Tomēr
par to nav nekādas kontroles!
Izmantosim tipu mājienu un
skaidri norādīsim objektu tipu kā Figure:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
Izpētīsim, ko mēs esam izdarījuši.
Ja Figure būtu reāli pastāvoša
klase, tad metodē kā parametru mēs varētu
padot šīs klases objektus, kā arī
tās mantiniekus.
Mums taču Figure ir interfeiss.
Šādā gadījumā mājiens nozīmē, ka
metodes parametrā var tikt padoti tikai
to klašu objekti, kas realizē mūsu interfeisu.
Mēģināsim izveidot mūsu klases objektu un pievienot tajā ģeometriskās formas:
<?php
$figuresCollection = new FiguresCollection;
// Pievienosim pāris kvadrātus:
$figuresCollection->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// Pievienosim pāris taisnstūrus:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
Mēģinājums pievienot kādas citas klases objektu izraisīs kļūdu:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // kāda cita klase
$figuresCollection->add(new Test); // izvadīs kļūdu
?>
Ko praksē mums sniedz šāda kontrole:
tā kā visas kolekcijā pievienotās formas
realizē interfeisu Figure, mēs varam
būt pārliecināti, ka katrai no tām būs metode
getSquare un metode
getPerimeter.
Iespējams nākotnē papildus kvadrātam un taisnstūrim
parādīsies, piemēram, vēl trīsstūris.
Šādā gadījumā arī trīsstūrim būs
metodes getSquare un
getPerimeter.
Praksē tas mums dod sekojošo: mēs varam
klasē FiguresCollection izveidot,
piemēram, metodi getTotalSquare, kas atrod
kopējo formu kolekcijas laukumu. Šajā metodē
mēs ciklā pārtīsim formu masīvu un
katrai formai izsauksim
metodi getSquare.
Tā kā katra forma realizē interfeisu
Figure, mēs varam būt 100%
pārliecināti par to, ka katrai formai būs
šī metode getSquare.
Tātad, šeit ir metodes realizācija:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
// Atradīsim kopējo laukumu:
public function getTotalSquare()
{
$sum = 0;
foreach ($this->figures as $figure) {
$sum += $figure->getSquare(); // izmantojam metodi getSquare
}
return $sum;
}
}
?>
Neieskatoties manā kodā, realizējiet tādu
pašu klasi FiguresCollection.
Pievienojiet klasei FiguresCollection
metodi getTotalPerimeter, lai atrastu
visu formu kopējo perimetru.