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