Няколко интерфейса в ООП в 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.