Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi

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:

  1. Ortak davranışı belirleyen interface’i tanımlayın.
  2. Interface içindeki her metodun adını, parametrelerini ve varsa dönüş türünü belirleyin.
  3. Bu sözleşmeye uyan her sınıfta implements anahtar kelimesini kullanın.
  4. Eksik metotları sınıfa ekleyin; parametre ve dönüş türlerini interface ile uyumlu tutun.
  5. 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:

Özellikinterfaceabstract class
Ana amaçUyulacak sözleşmeyi tanımlamakOrtak temel davranış sağlamak
Hazır metot gövdesiMetot gövdesi tanımlanmazOlabilir
Sınıf ilişkisiBir sınıf birden fazla interface uygulayabilirBir sınıf yalnızca bir sınıftan miras alabilir
Uygun kullanımBirbirinden 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.

Uygulayan sınıfta parametre adını değiştirebilir miyim?​

Dil buna izin verebilir, ancak adlandırılmış argüman kullanan çağrılar parametre adına dayanır. Bu yüzden interface ile uygulama sınıfında parametre adlarını da aynı tutmak önerilir; yalnızca tür uyumluluğuna bakmayın.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic