Više interfejsa u OOP-u u PHP-u
PHP nema višestruko nasleđivanje - svaka klasa
može imati samo jednog roditelja.
Sa interfejsima je, međutim, drugačije:
svaka klasa može implementirati bilo koji broj
interfejsa. Da bismo to uradili, imena interfejsa
treba navesti zarezom posle ključne reči
implements.
Ovo je još jedna razlika interfejsa od apstraktnih klasa - možete implementirati više interfejsa, ali ne možete naslediti više apstraktnih klasa.
Hajde da probamo u praksi. Pored
interfejsa iFigure, pretpostavimo da imamo i
interfejs iTetragon.
Metode ovog interfejsa će implementirati
klase Quadrate i Rectangle,
jer one imaju 4 strane, ali ne i klasa
Disk.
Neka interfejs iTetragon opisuje
getere za sve četiri strane
četvorougla:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Neka takođe postoji interfejs iFigure,
koji smo već pravili ranije:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Hajde da učinimo da klasa Quadrate
implementira dva interfejsa. Da bismo to uradili, nabrojimo
oba interfejsa zarezom posle ključne
reči implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// ovde će biti implementacija
}
?>
Sada ćemo doraditi našu klasu Quadrate,
tako da implementira interfejs iTetragon.
Jasno je da je naš kvadrat degenerisani
slučaj četvorougla, jer kvadrat ima
sve strane jednake. Stoga će sve nove metode
vraćati istu vrednost - širinu kvadrata:
<?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;
}
}
?>
Očigledno je da u pravougaoniku već nisu
sve strane iste, već samo naspramne.
U tom slučaju, nove metode će se malo
razlikovati. Pa, i u nekoj trapezu
uopšte će sve 4 strane biti različite.
Međutim, nije važno koju figuru razmatramo - važno je da će sve te figure imati opisane metode (neka su neke figure i degenerisane) i radiće na isti način.
Učinite da klasa Rectangle
takođe implementira dva interfejsa: i iFigure,
i iTetragon.
Napravite interfejs iCircle sa metodama
getRadius i getDiameter.
Učinite da klasa Disk takođe
implementira dva interfejsa: i iFigure,
i iCircle.