PHP-де ООП-те интерфейстерді қолдану
Сонымен, біз интерфейстердің барлық қажетті әдістердің класта жүзеге асырылғанын бақылаудың жақсы тәсілі екенін білдік.
Тағы бір практикалық мысалды қарастырайық. Бізде объектілер-фигуралар жиынын сақтайтын класс бар делік:
<?php
class FiguresCollection
{
private $figures = []; // фигуралар үшін массив
}
?>
Біздің класта жиынқа объектілерді қосу үшін
addFigure әдісін жүзеге асырайық:
<?php
class FiguresCollection
{
private $figures = [];
// Параметр ретінде фигура объектісі беріледі:
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
addFigure әдісінің параметрі ретінде
фигура объектісі берілетіні анық. Алайда бұл
үшін ешқандай бақылау жоқ!
Типтер үшін подсказканы қолданып, объектілер
түрін Figure ретінде анық көрсетейік:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
Біз не істедік, соны анықтап көрейік.
Егер Figure нақты бар болған класс болса,
онда әдіс параметріне біз осы кластың объектілерін
және оның мұрагерлерін де бере алатын едік.
Бізде, алайда, Figure - бұл интерфейс.
Бұл жағдайда подсказка әдіс параметріне біздің
интерфейсін жүзеге асыратын кластың объектілері
ғана берілуі мүмкін екенін білдіреді.
Біздің кластың объектісін жасап, оған фигураларды қосуды көрейік:
<?php
$figuresCollection = new FiguresCollection;
// Бірнеше шаршы қосамыз:
$figuresCollection->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// Бірнеше тіктөртбұрыш қосамыз:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
Кез келген басқа кластың объектісін қосуға тырысу қатеге әкеледі:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // басқа бір класс
$figuresCollection->add(new Test); // қате шығарады
?>
Тәжірибеде бізге мұндай бақылау не береді:
жиынқа қосылған барлық фигуралар Figure
интерфейсін жүзеге асырғандықтан, біз әрбір
фигурада getSquare әдісі және
getPerimeter әдісі болатынына сенімді бола аламыз.
Болашақта шаршы мен тіктөртбұрыштан басқа,
мысалы, үшбұрыш пайда болуы мүмкін. Бұл
жағдайда үшбұрышта да getSquare және
getPerimeter әдістері болады.
Тәжірибеде бұл бізге мынаны береді: біз
FiguresCollection класында, мысалы,
фигуралар жиынының толық ауданын табатын
getTotalSquare әдісін жасай аламыз.
Бұл әдісте біз фигуралар массивін циклмен
қайталап, әрбір фигурада getSquare
әдісін шақырамыз.
Әрбір фигура Figure интерфейсін жүзеге
асырғандықтан, біз әрбір фигурада бұл
getSquare әдісі болатынына 100%
сенімді бола аламыз.
Сонымен, әдістің жүзеге асырылуы:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
// Толық ауданын табамыз:
public function getTotalSquare()
{
$sum = 0;
foreach ($this->figures as $figure) {
$sum += $figure->getSquare(); // getSquare әдісін қолданамыз
}
return $sum;
}
}
?>
Менің кодқа қарамастан, осындай FiguresCollection
класын жүзеге асырыңыз.
FiguresCollection класына барлық фигуралардың
жиынтық периметрін табу үшін getTotalPerimeter
әдісін қосыңыз.