- Konu sahibi
- #1
PHP interface nedir?
PHP’de
interface, bir sınıfın hangi metotları sunmak zorunda olduğunu belirleyen sözleşmedir. Interface, metotların gövdesini yazmadan imzalarını tanımlar; bu metotların nasıl çalışacağını interface’i uygulayan sınıf (implements) yazar. Böylece aynı işi yapan farklı sınıflar, ortak bir tür üzerinden kullanılabilir.Interface doğrudan örneklenemez. Onu kullanan her somut sınıf, interface içinde tanımlanan tüm metotları public görünürlükle ve uyumlu imzalarla uygulamalıdır. Eksik uygulama ölümcül hataya neden olur. PHP 8.4 ve sonrasında interface, public özelliklerin okunma/yazılma sözleşmesini de tanımlayabilir; buradaki örnek metot sözleşmesine odaklanır.
En küçük çalışan örnek
Aşağıdaki örnekte ödeme işlemi için bir sözleşme tanımlanır.
checkout fonksiyonu ödeme sağlayıcısının nasıl çalıştığını bilmez; yalnızca PaymentGateway interface’inde belirtilen charge metoduna güvenir.
Kod:
<?php
interface PaymentGateway
{
public function charge(float $amount): string;
}
class TestGateway implements PaymentGateway
{
public function charge(float $amount): string
{
return 'Test sonucu: ' . number_format($amount, 2, '.', '') . ' TL';
}
}
function checkout(PaymentGateway $gateway): void
{
echo $gateway->charge(100.0) . PHP_EOL;
}
checkout(new TestGateway());
Dosyayı
interface-example.php adıyla kaydedip PHP’nin kurulu olduğu bir ortamda şu komutla çalıştırabilirsiniz:
Kod:
php interface-example.php
Beklenen çıktı şöyledir:
Kod:
Test sonucu: 100.00 TL
Bu örnek yalnızca metin üretir; banka, cüzdan veya ödeme ağına bağlanmaz ve para aktarmaz. Bu çıktı,
TestGateway sınıfının interface’i uyguladığını ve checkout fonksiyonunun somut sınıf yerine interface türünü kabul ettiğini gösterir. Gerçek projede TestGateway yerine banka, cüzdan veya başka bir ödeme sağlayıcısına bağlanan sınıflar eklenebilir.Interface nasıl çalışır?
Bir interface kullanırken temel akış şöyledir:
- Ortak davranışı belirleyen interface’i tanımlayın.
- Interface içindeki her metodun adını, parametrelerini ve varsa dönüş türünü belirleyin.
- Bu sözleşmeye uyan her sınıfta
implementsanahtar kelimesini kullanın. - Eksik metotları sınıfa ekleyin; parametre ve dönüş türlerini interface ile uyumlu tutun.
- Fonksiyon ve metot parametrelerinde somut sınıf yerine interface türünü kullanın.
Interface ile abstract class farkı
Karar verirken aşağıdaki ayrım yeterli bir başlangıç sağlar:
| Özellik | interface | abstract class |
|---|---|---|
| Ana amaç | Uyulacak sözleşmeyi tanımlamak | Ortak temel davranış sağlamak |
| Hazır metot gövdesi | Metot gövdesi tanımlanmaz | Olabilir |
| Sınıf ilişkisi | Bir sınıf birden fazla interface uygulayabilir | Bir sınıf yalnızca bir sınıftan miras alabilir |
| Uygun kullanım | Birbirinden bağımsız sınıfların aynı yeteneği sunması | Yakın akraba sınıfların ortak kod paylaşması |
Örneğin banka ve cüzdan sınıfları farklı temel yapılara sahip olabilir, fakat ikisi de ödeme yapabiliyorsa ortak bir
PaymentGateway interface’i uygundur. Ortak yardımcı kodu da paylaşmaları gerekiyorsa abstract class değerlendirilebilir.Birden fazla sınıf aynı interface’i uygulayabilir:
Kod:
class BankGateway implements PaymentGateway
{
public function charge(float $amount): string
{
return 'Banka uyarlayıcısı denemesi';
}
}
class WalletGateway implements PaymentGateway
{
public function charge(float $amount): string
{
return 'Cüzdan uyarlayıcısı denemesi';
}
}
Bu sınıfların davranışları farklıdır; ancak ikisi de
PaymentGateway olarak checkout fonksiyonuna gönderilebilir. Böylece ödeme kodunu kullanan bölüm, sağlayıcının ayrıntılarına bağlanmaz.Sık yapılan hatalar
Interface’i örneklemeye çalışmak:
new PaymentGateway() geçerli değildir; interface yalnızca sözleşmedir. Somut bir uygulama sınıfını örnekleyin.Bir metodu eksik bırakmak:
implements kullanan somut sınıf, interface’teki bütün metotları uygulamalıdır. Abstract sınıf, tamamlanmamış uygulamayı somut alt sınıfa bırakabilir. Eksik metot hatası alırsanız önce sınıfın tüm imzaları içerdiğini kontrol edin.Metot imzasını değiştirmek: Parametre türü, dönüş türü veya görünürlük interface ile uyumlu değilse uygulama geçersiz olabilir. Interface’i değiştirmek yerine tüm uygulayan sınıfların hangi sözleşmeye uyduğunu birlikte gözden geçirin.
Her sınıfı interface’e zorlamak: Interface yalnızca ortak davranış gerçekten varsa kullanılmalıdır. Bir interface’e ilgisiz metotlar eklemek, uygulayan sınıfları gereksiz ve yapay kod yazmaya zorlar.
Sık sorulan sorular
Bir interface birden fazla interface’i genişletebilir mi?
Evet. Bir interface,extends ile bir veya daha fazla interface’i genişletebilir. Onu uygulayan sınıf, üst interface’lerden gelen metotlar dahil tüm sözleşmeyi karşılamalıdır.