Бисёр интерфейсҳо дар ООП дар PHP
Дар PHP мероси бисёргона вуҷуд надорад - ҳар як
класс метавонад фақат як ворис дошта бошад.
Аммо бо интерфейсҳо вазъ гуногун аст:
ҳар як класс метавонад ҳар қадар интерфейсеро, ки мехоҳад,
амалӣ кунад. Барои ин номҳои интерфейсҳоро
пас аз калимаи калидии implements бо вергул ҷудо карда номбар мекунем.
Ин яке дигар аз фарқҳои интерфейсҳо бо классҳои абстрактӣ мебошад - шумо метавонед бисёр интерфейсҳоро амалӣ кунед, аммо бисёр классҳои абстрактиро мерос гирифтан мумкин нест.
Биёед дар амал санҷем. Фарз мекунем, ки ғайр аз
интерфейси iFigure мо инчунин интерфейси
iTetragon-ро дорем.
Методҳои ин интерфейс аз тарафи
классҳои Quadrate ва Rectangle амалӣ карда мешаванд,
зеро ки онҳо 4 тараф доранд, аммо на классҳои
Disk.
Бигзор интерфейси iTetragon
геттерҳо барои ҳамаи чор тарафи
чаҳоркунҷаро тавсиф кунад:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Бигзор инчунин интерф�ейси iFigure,
ки мо пештар сохта будем, вуҷуд дошта бошад:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Биёед тавре созем, ки класс Quadrate
ду интерфейсро амалӣ кунад. Барои ин ҳарду интерфейсро
пас аз калимаи калидии implements бо вергул ҷудо карда номбар мекунем:
<?php
class Quadrate implements iFigure, iTetragon
{
// дар ин ҷо амалӣ кардан хоҳад омад
}
?>
Акнун класси Quadrate-ро такмил диҳем,
то ки он интерфейси iTetragon-ро амалӣ кунад.
Равшан аст, ки квадрати мо ҳолати таназзули
чаҳоркунҷа мебошад, зеро ки дар квадрат
ҳамаи тарафҳо баробаранд. Аз ин рӯ, ҳамаи методҳои нав
ҳамон чизро бармегардонанд - паҳноии квадрат:
<?php
class Quadrate implements iFigure, iTetragon
{
private $a;
public function __construct($a)
{
$this->a = $a;
}
public function getA()
{
return $this->a;
}
public function getB()
{
return $this->a;
}
public function getC()
{
return $this->a;
}
public function getD()
{
return $this->a;
}
public function getSquare()
{
return $this->a * $this->a;
}
public function getPerimeter()
{
return 4 * $this->a;
}
}
?>
Равшан аст, ки дар росткунҷа дигар ҳамаи
тарафҳо якхела нестанд, фақат тарафҳои муқобил.
Дар ин сурат методҳои нав каме
фарқ хоҳанд дошт. Ва, мисол, дар як трапесия
ҳамаи 4 тарафҳо гуногун хоҳанд буд.
Аммо, фарқе надорад, ки кадом шаклро мо баррасӣ мекунем - муҳим ин аст, ки ҳамаи ин шаклҳо методҳои тавсифшударо хоҳанд дошт (ҳатто агар баъзе шаклҳо таназзулӣ ҳам бошанд) ва ба таври якхела кор кунанд.
Тавре созед, ки класси Rectangle
ҳам ду интерфейсро амалӣ кунад: ҳам iFigure,
ҳам iTetragon.
Интерфейси iCircle бо методҳои
getRadius ва getDiameter созед.
Тавре созед, ки класси Disk низ
ду интерфейсро амалӣ кунад: ҳам iFigure,
ҳам iCircle.