PHP'de OOP'de Arayüzlerin Kullanımı
Böylece, arayüzlerin bir sınıftaki gerekli tüm metodların uygulandığını kontrol etmek için iyi bir yol olduğunu zaten anladık.
Şimdi başka, daha pratik bir örneği ele alalım. Bir sınıfımız olsun ve bu sınıf bir dizi şekil nesnesini içinde saklasın:
<?php
class FiguresCollection
{
private $figures = []; // şekiller için dizi
}
?>
Sınıfımıza, koleksiyona nesne eklemek için
addFigure metodunu uygulayalım:
<?php
class FiguresCollection
{
private $figures = [];
// Parametre olarak bir şekil nesnesi iletilir:
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
Açıktır ki, addFigure metodunun parametresine
bir şekil nesnesi iletileceğini varsayıyoruz.
Ancak bunun için hiçbir kontrol yok!
Hadi tip ipuçlarını kullanalım ve nesne tipini
açıkça Figure olarak belirtelim:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
Yaptığımız şeyi anlamaya çalışalım.
Eğer Figure gerçekten var olan bir sınıf olsaydı,
metod parametresine bu sınıfın nesnelerini ve ayrıca
onun mirasçılarını iletebilirdik.
Ancak bizim durumumuzda, Figure bir arayüzdür.
Bu durumda tip ipucu, metod parametresine sadece
bizim arayüzümüzü uygulayan sınıfların nesnelerinin
iletilebileceği anlamına gelir.
Sınıfımızın bir nesnesini oluşturmayı ve içine şekiller eklemeyi deneyelim:
<?php
$figuresCollection = new FiguresCollection;
// Birkaç kare ekleyelim:
$figuresCollection->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// Birkaç dikdörtgen ekleyelim:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
Başka bir sınıfın nesnesini ekleme girişimi hataya yol açacaktır:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // başka bir sınıf
$figuresCollection->add(new Test); // hata verecek
?>
Pratikte böyle bir kontrol bize ne sağlar:
koleksiyona eklenen tüm şekiller Figure
arayüzünü uyguladığı için, her birinde
getSquare metodu ve
getPerimeter metodu olacağından
emin olabiliriz.
Belki ileride kare ve dikdörtgenin yanı sıra,
örneğin bir üçgen daha ortaya çıkacak. Bu
durumda üçgenin de
getSquare ve
getPerimeter metodları olacaktır.
Pratikte bu bize şunu sağlar:
FiguresCollection sınıfında,
örneğin, koleksiyondaki şekillerin toplam
alanını bulan getTotalSquare metodunu
yapabiliriz. Bu metotta şekil dizisini
döngü ile gezeceğiz ve her şekilde
getSquare metodunu çağıracağız.
Her şekil Figure arayüzünü
uyguladığı için, %100
her şekilde bu getSquare metodunun
olacağından emin olabiliriz.
İşte metodun uygulaması:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
// Toplam alanı bulalım:
public function getTotalSquare()
{
$sum = 0;
foreach ($this->figures as $figure) {
$sum += $figure->getSquare(); // getSquare metodunu kullan
}
return $sum;
}
}
?>
Benim koduma bakmadan aynı
FiguresCollection sınıfını uygulayın.
FiguresCollection sınıfına
tüm şekillerin toplam çevresini bulmak için
getTotalPerimeter metodunu ekleyin.