PHP arayüzleri noktası nedir?

9 Cevap php

Interfaces bunu uygulamak sınıfların yöntemlerini tanımlar kodu oluşturmak için izin verir. Ancak bu yöntemlerin herhangi bir kod ekleyebilirsiniz olamaz.

Abstract classes Eğer yöntemi kodu ekleyerek birlikte, aynı şeyi yapmak için izin verir.

Soyut sınıflar ile aynı hedefe ulaşmak eğer Şimdi, neden biz bile arayüzleri kavramını gerekiyor?

Ben C + + PHP'nin OO şeyler dayanmaktadır budur Java, için OO teori ile ilgisi olduğu söylendi. Kavram Java kullanışlı değil PHP mi? Sadece soyut sınıfta dolmuştu tutucuları sahip tutmak için bir yolu var mı? Ben bir şey eksik?

9 Cevap

Arayüzlerin tüm nokta size sınıf birden arabirimlerini, ama yine de birden çok devralma izin vermez zorunda zorunda flexability vermektir. Birden fazla sınıflar devralan ile sorunlar çok çeşitlidir ve üzerinde wikipedia sayfa oldukça iyi onları özetliyor.

Arayüzleri bir uzlaşma vardır. Çoklu kalıtımın sorunların çoğu bu gün birden kalıtım henüz soyut temel sınıflar arabirimleri aramak ve bir sınıf istedikleri gibi bu kadar çok sayıda "uygulamaya" izin veriyor devre dışı soyut temel sınıflar, bu yüzden en modern diller için geçerli değildir.

Kavramı nesne yönelimli programlama çevresinde yararlıdır. Benim için ben bir sözleşme gibi bir arayüz düşünüyorum. Uzun zamandır benim sınıf ve sınıf bu yöntem imzası sözleşme yapabiliriz "arayüz" katılıyorum. Soyut sınıflar Ben bazı yöntemler saplama ve ayrıntıları doldurmak için gereken temel sınıflar daha fazla olarak görmek isteyenler için gibi.

Arayüz ve bir soyut sınıfını kullanarak arasındaki fark, dilin kendisi tarafından uygulanması daha, benim için kod organizasyonu ile yapmak daha vardır. Onlar amaçlanan tasarım kalıpları içinde kalmak böylece çalışmak için diğer geliştiriciler için kod hazırlanırken ben onları çok kullanın. Kodunuzu size Aceess gerekmez kod geliyor olabilir API çağrıları bir öngörülmüş yanıt kabul sayede arayüzler "sözleşme tasarım" bir türüdür.

Soyut sınıfından miras olsa bir ne istediğiniz değil her zaman ilişki, "bir", ve bir arabirim uygulama ilişkisi a "gibi eylemleri" daha fazladır. Bu fark bazı bağlamlarda oldukça önemli olabilir.

Örneğin, bize birçok diğer sınıfları (vb hesapları ve türleri) uzandığı soyut bir sınıf Hesabınız var diyelim. Bu, bu tür bir grup için geçerlidir olan yöntemler belirli bir dizi bulunmaktadır. Onlar bu API'leri kullanmak için beklemeyin denetleyicileri atılır böylece Ancak, bu hesabı alt sınıflarından bazı Sürümlendirilebilir veya Listable veya Düzenlenebilir uygulamak. Denetleyicisi, ne tür bir nesnenin umursamıyor

Buna karşılık, ben de Hesabından uzanmaz bir nesne oluşturabilirsiniz, burada mantıklı değil Sürümlendirilebilir, bir kullanıcı soyut sınıf söylüyorlar ve hala Listable ve Düzenlenebilir uygulamak, ama.

Bu şekilde, ben FooUser alt sınıf bir hesap değil, ama bir Düzenlenebilir nesne gibi hareket ETMEZ söylüyorum. Aynı şekilde BarAccount Hesap uzanan, ancak bir kullanıcı alt sınıf değil, ancak düzenlenebilir, Listable ve ayrıca Sürümlendirilebilir uygular.

Kendisi darmadağın ve çirkin olurdu değil sadece soyut sınıflara Düzenlenebilir, Listable ve Sürümlendirilebilir bu API'ler tüm ekleyerek, ama Hesap ve Kullanıcı ortak arayüzleri çoğaltmak, ya da Sürümlendirilebilir uygulamak benim User nesnesi zorlayacaktır ya, muhtemelen sadece bir atmak için istisna.

Arayüzleri aslında ne oluşturabilirsiniz için bir plan vardır. Onlar hangi yöntemleri bir sınıf must have tanımlamak, ancak bu sınırlamalar dışında ekstra yöntemleri oluşturabilirsiniz.

Ben yöntemlere kodu eklemek mümkün olmayan ne demek emin değilim - yapabilirsiniz çünkü. Eğer soyut bir sınıf veya genişleten sınıf arayüzü uygulamak mı?

Soyut sınıfına uygulanan arayüzünde bir yöntem bu soyut sınıfta uygulanan gerekecektir. Bununla birlikte uzanan sınıfına bu arabirim uygulamak ve yöntem, yalnızca uzanan sınıfta uygulanması gerekmektedir. Burada yanlış olabilir - Ben sıklıkta could / gerektiği gibi arayüzleri kullanmayın.

Ben her zaman şeyler doğru olduğundan emin olmak için harici geliştiriciler için bir desen ya da ekstra bir kural seti gibi arabirimler düşündüm.

PHP arayüzleri kullanın:

  1. Uygulanmasını gizlemek - kullanmış olduğunuz nesneleri bir değişiklik tüm yerlerde üstlenmeden olmadan temel uygulama sınıfına bir erişim protokolü kurmak olduğunu nesneleri
  2. Türünü kontrol etmek için - bir parametre belirli bir türü $object instanceof MyInterface olduğundan emin olarak
  3. Parametreyi zorlamak için çalışma zamanında kontrol
  4. To implement multiple behaviours into a single class (build complex types)

    class Car implements EngineInterface, BodyInterface, SteeringInterface {

so that a Car object ca now start(), stop() (EngineInterface) or goRight(),goLeft() (Steering interface)

ve diğer şeyler şu anda düşünemiyorum

Sayı 4 muhtemelen soyut sınıflar ile adres olamaz en belirgin kullanım durumunda bulunuyor.

Java Düşünme Gönderen:

Bir arabirim "Bu, belirli bir arabirimi uygulayan tüm sınıflar gibi görüneceğini budur." Diyor Böylece, belirli bir arayüz kullanan herhangi bir kod yöntemleri bu arabirim için denebilecek bilir, ve hepsi bu. Yani, arayüz sınıflar arasında bir "protokol" kurmak için kullanılır.

Benim düşünceme göre, arayüzler işlevsel olmayan soyut sınıflar tercih edilmelidir. Yerine ben emin olamaz, olsa, ben iç işleyişini aşina değilim (onları birleştirerek, iki ayrıştırma örneği yalnızca bir nesne, olduğu gibi, orada bile bir performans isabet olurdu Eğer ben şaşırmam OOP PHP).

Bu arayüzler, Java, diyelim ki, kıyasla daha anlamlı / az yararlı olduğu doğrudur. Öte yandan, PHP6 dönüş değerleri için tip ipuçlarının dahil olmak üzere daha Tür Dayatma, tanıtacak. Bu PHP arayüzleri bazı değer eklemek gerekir.

tl; dr: soyut bir sınıf alt sınıfları belirli ihtiyaçlarına rafine bazı ortak / temel işlevlerini verirken arayüzleri (API düşünüyorum) takip edilmesi gereken yöntemler bir listesini tanımlar.

Arayüzleri sadece emin geliştiricilerin belirli yöntemleri uygulamak yapmak için değildir. Fikir, bu sınıfları belirli yöntemleri var garanti edilir çünkü sınıfının gerçek türünü bilmiyorsanız bile, bu yöntemleri kullanabilirsiniz olmasıdır. Örnek:

interface Readable {
  String read();
}

List<Readable> readables; // dunno what these actually are, but we know they have read();
for(Readable reader : readables)
  System.out.println(reader.read());

Uygulamaları çılgınca değişir ve birkaç yöntemleri yanı sıra, ortak bir şey paylaşmak yok çünkü birçok durumda, bu bir temel sınıf, soyut ya da değil sağlamak için mantıklı değil.

Dinamik yazdığınız dilleri arabirimleri gerekmez "ördek-yazarak" kavramını var; Eğer nesne üzerinde aradığınız yöntemi olduğunu varsaymak için ücretsizdir. Bu nesne bazı yöntem (benim örnekte, read ()) sahiptir statik yazdığınız dilde soruna çalışır, ancak arabirimini uygulamıyor.

PHP bu açıdan farklı olup olmadığını hatırlamıyorum, ama Java, birden fazla arabirimleri uygulayabilirsiniz, ancak birden çok soyut sınıflar miras alamaz. PHP aynı şekilde çalışır varsaymak istiyorum.

PHP, bir virgül ile ayırarak birden çok arabirimi uygulayabilirsiniz (ben düşünüyorum, ben bu temiz soloution bulmuyorum).

Birden fazla soyut sınıflar için olduğu gibi (yine, ben bu konuda tamamen emin değilim ama ben daha önce bir yerlerde gördüm düşünüyorum) birbirine uzanan birden özetleri olabilir. Eğer uzatamaz tek şey bir son sınıftır.

Arayüzleri kodunuzu herhangi bir performans artırır veya böyle bir şey vermek istemiyorum, ama onlar sürdürülebilir hale doğru uzun bir yol gidebilirsiniz. Bu soyut bir sınıf (hatta olmayan bir soyut sınıf) kodunuz için bir arayüz oluşturmak için kullanılabilir olması doğrudur, ancak uygun arayüzler (Eğer anahtar kelime ile tanımlamak ve bu olanları tek yöntem imzalarını içeren) için sadece düz kolaydır sıralamak ve okumak.

Söyleniyor, ben bir sınıf üzerinde bir arayüz kullanımı olup olmadığını karar verirken takdir kullanma eğiliminde. Bazen varsayılan yöntem uygulamaları, ya da tüm alt sınıflar için ortak olacak değişkenleri istiyorum.

Tabii ki, çok arayüz uygulaması hakkında noktası çok, bir ses biri. Eğer birden çok arabirimi uygulayan bir sınıf varsa, aynı uygulamada farklı olarak bu sınıfın bir nesnesini kullanabilirsiniz.

Soru PHP ile ilgili olması, olsa, işler biraz daha ilginç hale getirir. Eğer oldukça fazla türü ne olursa olsun, herhangi bir yöntemle bir şey yem nerede arayüzler yazarak PHP hala inanılmaz gerekli değildir. Sen (String, ben inanıyorum, bazı hıçkırık neden) statik yöntem parametreleri yazabilirsiniz, ama bu biraz bozuldu. En diğer başvurular yazamaz, ve çok değer PHP statik yazarak zorlamak için çalışırken olmadığı gerçeği ile çift bu (at this point). Ve çünkü, arayüzleri değeri in PHP, at this point daha güçlü-daktilo dilde daha azdır. Onlar okunabilirlik yararı var, ama biraz başka. Hala yöntemleri beyan ve uygulayıcı içinde onlara organları vermek zorunda çünkü çoklu-uygulama, hatta yararlı değildir.