PHP da OOP da Interfeyslardan Foydalanish
Shunday qilib, biz allaqachon bilib oldikki, interfeyslar - bu kerakli barcha klass metodlari amalga oshirilganligini nazorat qilishning yaxshi usuli.
Keling, yana bir, amaliyroq misolni ko'rib chiqaylik. Faraz qilaylik, bizda obyekt-shakllar massivini saqlaydigan klass mavjud:
<?php
class FiguresCollection
{
private $figures = []; // shakllar uchun massiv
}
?>
Kolleksiyaga obyektlarni qo'shish uchun klassimizda addFigure
metodini amalga oshiramiz:
<?php
class FiguresCollection
{
private $figures = [];
// Parametr sifatida shakl bilan obyekt uzatiladi:
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
Aniqki, biz addFigure metodi parametri sifatida
shakl bilan obyekt uzatilishini hisoblaymiz. Biroq buning
uchun hech qanday nazorat yo'q!
Keling, turlar uchun maslahatdan foydalanamiz va
obyektlar turini aniq Figure deb ko'rsatamiz:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
Keling, nima qilganimizni aniqlab olaylik.
Agar Figure haqiqiy mavjud bo'lgan klass
bo'lsa, metod parametriga biz ushbu klassning obyektlarini,
shuningdek uning vorislarini ham uzata olamiz.
Bizda, Figure interfeys ekan.
Bunday holda, maslahat shuni anglatadiki,
metod parametriga faqat bizning interfeysimizni amalga oshiradigan
klassning obyektlari uzatilishi mumkin.
Keling, klassimizning obyektini yaratishga va unga shakllarni qo'shishga harakat qilaylik:
<?php
$figuresCollection = new FiguresCollection;
// Bir nechta kvadrat qo'shamiz:
$figuresCollection->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// Bir nechta to'rtburchak qo'shamiz:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
Boshqa bir klassning obyektini qo'shishga urinish xatolikka olib keladi:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // boshqa bir klass
$figuresCollection->add(new Test); // xatolik beradi
?>
Amaliyotda bunday nazorat bizga nima beradi:
chunki kolleksiyaga qo'shilgan barcha shakllar
Figure interfeysini amalga oshiradi, biz
har birida getSquare metodi va
getPerimeter metodi bo'lishiga ishonch hosil qilamiz.
Ehtimol kelajakda kvadrat va to'rtburchakdan tashqari
masalan, uchburchak ham paydo bo'ladi. Bu
holda uchburchakda ham
getSquare va getPerimeter
metodlari bo'ladi.
Amaliyotda bu bizga quyidagilarni beradi: biz
FiguresCollection klassida, masalan,
kolleksiya shakllarining to'liq maydonini topadigan
getTotalSquare metodini yaratishimiz mumkin. Ushbu metodda
biz shakllar massivini tsiklda aylantiramiz va
har bir shaklda getSquare metodini chaqiramiz.
Chunki har bir shakl Figure
interfeysini amalga oshiradi, biz 100%
har bir shaklda ushbu getSquare metodining
bo'lishiga ishonch hosil qilamiz.
Shunday qilib, metodni amalga oshirish:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
// To'liq maydonni topamiz:
public function getTotalSquare()
{
$sum = 0;
foreach ($this->figures as $figure) {
$sum += $figure->getSquare(); // getSquare metodidan foydalanamiz
}
return $sum;
}
}
?>
Mening kodimga qaramay, xuddi shunday
FiguresCollection klassini amalga oshiring.
FiguresCollection klassiga
barcha shakllarning umumiy perimetrini topish uchun
getTotalPerimeter metodini qo'shing.