Запіс на курсы па HTML, CSS, JavaScript, PHP, Python, фрэймворкам і CMS,
а таксама: дапамога ў пошуку працы і заказаў, стажыроўка на рэальных праектах→
⊗ppOpIfAp 68 of 107 menu

Ужыванне інтэрфейсаў у ААП у 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, мы можам быць на 100% упэўненыя ў тым, што ў кожнай фігуры будзе гэты метад getSquare.

Такім чынам, вось рэалізацыя метаду:

<?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 для знаходжання сумарнага перыметра ўсіх фігур.

byenru