Menu

PHP Interface (Arayüz): implements, Sabitler ve Örnekler

Bir PHP arayüzü bir sınıfın sahip olmayı vaat ettiği metotları listeler: interface Shape { public function area(): float; }; class Circle implements Shape ardından area() metodunu tanımlamak zorundadır. Arayüzlerle tür ipuçlarını, birkaç arayüz uygulamayı, arayüz sabitlerini, arayüzleri genişletmeyi, Countable gibi yerleşik arayüzleri ve arayüz ile soyut sınıf farkını öğrenin.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

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üzSoyut sınıf
Metot gövdeleriyok (yalnızca imzalar)soyut ve tamamlanmış metotlar
Özelliklerhayırevet
Yapıcıtanımlayabilir, nadiren işe yararevet, kodla
Metotların görünürlüğüyalnızca publicpublic, protected, private
Sabitlerevetevet
Sınıf başına kaç taneistenen sayıda (implements A, B, C)bir (extends Base)
Tipik kullanımbir yetenek: Exportable, Countablebir 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.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

BAŞLA