Bir PHP arayüzü, bir sınıfın sağlamayı vaat ettiği metotları hiç kod olmadan tanımlar: interface Shape { public function area(): float; }. implements Shape yazan bir sınıf area() metodunu tanımlamak zorundadır ve Shape tür ipucu kullanan her fonksiyon o sınıfı kabul eder.
describe() hangi sınıfı aldığını bilmez ve umursamaz. Yalnızca arayüzün verdiği söze güvenir, bu yüzden yeni bir Triangle implements Shape tek satır değiştirmeden onunla çalışır.
Bir arayüze göre programlama
Arayüz yazmanın olağan nedeni, kodun belirli bir sınıf yerine bir yeteneğe bağlı olmasını sağlamaktır. Burada bir sipariş servisi herhangi bir Notifier kabul eder, böylece aynı kod üretimde e-posta gönderebilir ve bir testte mesajları toplayabilir:
Birden çok arayüz uygulama
Bir sınıf en fazla bir üst sınıfı genişletir, ama ihtiyaç duyduğu kadar arayüz uygulayabilir. Onları implements sonrasında virgülle ayırarak listeleyin ve hepsinin metotlarını tanımlayın:
JsonSerializable PHP'nin yerleşik arayüzlerinden biridir: onu uygulamak json_encode() fonksiyonunun nesne için ne üreteceğini belirler.
Arayüz sabitleri
Bir arayüz sabitler tanımlayabilir. Onu uygulayan her sınıf bunları kalıtır ve onları arayüz adı veya sınıf adı üzerinden okuyabilirsiniz:
PHP 8.3'te arayüzlerin özellikleri olamaz, yalnızca metotları ve sabitleri olabilir. Metotlar statik olabilir: arayüzdeki public static function fromArray(array $data): static; her sınıfı o statik metodu tanımlamaya zorlar. Sabit bir ilişkili değerler kümesi için bir enum çoğu zaman bir arayüz sabitleri listesinden daha uygundur.
Bir arayüz başka arayüzleri genişletebilir
Arayüzler de extends kullanır ve sınıfların aksine aynı anda birkaçını genişletebilir. Alt arayüzü uygulayan bir sınıf bütün zincirin metotlarını tanımlamalıdır:
Yerleşik arayüzler: Countable, IteratorAggregate, Stringable
PHP nesneleri dile bağlayan arayüzlerle gelir. Countable count($obj) ifadesini, IteratorAggregate foreach döngüsünü çalıştırır ve Stringable __toString() metodu olan her sınıf tarafından otomatik olarak uygulanır:
Bir metodu unutmak
Bir sınıf bir arayüzü uyguladığını söyleyip bir metodu atlarsa PHP eksik metodu adıyla belirten ölümcül bir hatayla durur:
Bir total() metodu ekleyin, betik çalışır. Bir soyut sınıf arayüz metotlarını tanımsız bırakabilir; hata mesajının önerdiği çıkış yolu budur.
Arayüz ile soyut sınıf
İkisi de bir sınıfın sahip olması gereken metotları tanımlar ve ikisi de tür ipucu olarak kullanılabilir. Fark, başka neler içerebildikleri ve bir sınıfın kaç tanesini kullanabildiğidir:
| Arayüz | Soyut sınıf | |
|---|---|---|
| Metot gövdeleri | yok (yalnızca imzalar) | soyut ve tamamlanmış metotlar |
| Özellikler | hayır | evet |
| Yapıcı | tanımlayabilir, nadiren işe yarar | evet, kodla |
| Metotların görünürlüğü | yalnızca public | public, protected, private |
| Sabitler | evet | evet |
| Sınıf başına kaç tane | istenen sayıda (implements A, B, C) | bir (extends Base) |
| Tipik kullanım | bir yetenek: Exportable, Countable | bir aile için paylaşılan kod: Model, Controller |
Birlikte iyi çalışırlar: tür ipucu için arayüzü tanımlayın ve onu ortak kodla uygulayan soyut bir temel sınıf sunun. Farklı bir temel sınıfa ihtiyaç duyan sınıflar yine de arayüzü doğrudan uygulayabilir.
Sıkça Sorulan Sorular
PHP'de interface nedir?
Gövdesi olmayan public metot imzalarının bir listesidir: interface Logger { public function log(string $msg): void; }. implements Logger diyen bir sınıf içindeki her metodu tanımlamak zorundadır ve Logger tür ipucu kullanan her kod o sınıfı kabul eder.
Bir PHP sınıfı birden çok arayüz uygulayabilir mi?
Evet. Onları implements sonrasında virgülle ayırarak listeleyin: class File implements Readable, Writable, Countable. Sınıf hepsinin metotlarını tanımlamalıdır. PHP, diğer dillerde çoklu kalıtımın yaptığını bu şekilde karşılar.
PHP'de interface ile abstract class arasındaki fark nedir?
Bir arayüz yalnızca public metotları (ve sabitleri) tanımlar; özellikleri ve metot kodu yoktur ve bir sınıf birçok arayüz uygulayabilir. Bir soyut sınıf soyut metotlarının yanında özellikler, yapıcılar ve tamamlanmış metotlar tutabilir, ama bir sınıf yalnızca birini genişletebilir. Bir yetenek için ("dışa aktarılabilir") arayüz, bir sınıf ailesinde paylaşılan kod için soyut sınıf kullanın.
Bir PHP arayüzünün özellikleri olabilir mi?
PHP 8.3'te hayır: bir arayüz metot imzaları ve sabitler (const VERSION = 2;) içerebilir ama özellik içeremez. Arayüzlerde özellik tanımları (property hooks) ancak PHP 8.4'te geldi.
PHP'de bir nesnenin bir arayüzü uygulayıp uygulamadığını nasıl kontrol ederim?
instanceof kullanın: nesnenin sınıfı arayüzü doğrudan veya bir üst sınıf üzerinden uyguluyorsa $obj instanceof Countable true olur. class_implements($obj) sınıfın uyguladığı tüm arayüzlerin adlarını döndürür.