Интерфейсҳо дар ООП дар 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 -ро барои ёфтани
периметри ҳамаи шаклҳо илова кунед.