PHP da OOP da Bir Nechta Interfeyslar
PHP da ko'p meros yo'q - har bir
class faqat bitta ota-ona bo'lishi mumkin.
Interfeyslar bilan ish, biroq, boshqacha:
har bir class istalgan miqdordagi interfeyslarni
amalga oshirishi mumkin. Buning uchun interfeys nomlarini
implements kalit so'zidan keyin vergul bilan ajratib yozish kerak.
Bu interfeyslarning mavhum classlardan yana bir farqini namoyon etadi - ko'p interfeyslarni amalga oshirish mumkin, lekin bir nechta mavhum classlardan meros olish mumkin emas.
Keling, amalda sinab ko'ramiz. Faraz qilaylik, bizda
iFigure interfeysidan tashqari
iTetragon interfeysi ham bor.
Ushbu interfeys metodlari
Quadrate va Rectangle classlari tomonidan amalga oshiriladi,
chunki ularning 4 tomoni bor, lekin Disk
classi emas.
Faraz qilaylik, iTetragon interfeysi
to'rtburchakning barcha to'rt tomoni uchun
getterlarni ta'riflaydi:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Faraz qilaylik, bizda ilgari yaratgan
iFigure interfeysi ham bor:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Keling, Quadrate classi
ikki interfeysni amalga oshirishini ta'minlaylik. Buning uchun
ikkala interfeysni implements kalit so'zidan keyin
vergul bilan ajratib yozamiz:
<?php
class Quadrate implements iFigure, iTetragon
{
// bu yerda amalga oshiriladi
}
?>
Keling, endi Quadrate classimizni
iTetragon interfeysini amalga oshirishi uchun ishlab chiqamiz.
Tushunarli bo'lishi kerakki, bizning kvadratimiz to'rtburchakning
o'ziga xos holatidir, chunki kvadratning
barcha tomonlari teng. Shuning uchun barcha yangi metodlar
bir xil narsani qaytaradi - kvadratning kengligini:
<?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;
}
}
?>
Aniqki, to'rtburchakda hamma
tomonlar bir xil emas, faqat qarama-qarshi tomonlar.
Bunday holda yangi metodlar biroz
farq qiladi. Xo'sh, va har qanday trapetsiyada
umuman barcha 4 tomon har xil bo'ladi.
Biroq, qanday shaklni ko'rib chiqayotganimiz muhim emas - muhimi, barcha bu shakllar tavsiflangan metodlarga ega bo'ladi (garchi ba'zi shakllar o'ziga xos bo'lsa ham) va bir xil tarzda ishlaydi.
Rectangle classi ham ikkita interfeysni amalga oshirishini ta'minlang: ham iFigure,
ham iTetragon.
getRadius va getDiameter metodlariga ega
iCircle interfeysini yarating.
Disk classi ham ikkita interfeysni amalga oshirishini ta'minlang: ham iFigure,
ham iCircle.