Bir sınıf hem bir sınıfı genişletebilir hem de bir Arayüz uygulayabilir mi?


100

Bir sınıf PHP'de hem arabirimi hem de başka bir sınıfı genişletebilir mi?
Temel olarak şunu yapmak istiyorum:

interface databaseInterface{
 public function query($q);
 public function escape($s);
 //more methods
}

class database{ //extends both mysqli and implements databaseInterface
 //etc.
}

Bunu basitçe yaparak nasıl yaparsınız:

class database implements databaseInterface extends mysqli{ 

önemli bir hatayla sonuçlanır:

Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_EXTENDS, * dosyada * satır * satırında * '{' bekleniyor

18
Bu nasıl çok yerelleştirildi ?! "Bu sorunun gelecekteki ziyaretçilere yardımcı olma olasılığı düşüktür". Yine de en iyi cevabın 33 olumlu oyu var ve soru 4 yıldız!
duality_

Yanıtlar:


177

Başka bir şekilde deneyin:

class database extends mysqli implements databaseInterface { ...}

Bu çalışmalı.


Ahh, çok teşekkür ederim. Neden tam olarak tersi olmaları gerekiyor?
Pim Jager

14
Yalnızca bir sınıfı miras alabileceğiniz ve herhangi bir sayıda arabirim uygulayabileceğiniz için, bu muhtemelen bir sözdizimi şeker şeyiydi. Ayrıca, alt sınıfınız herhangi bir arabirim uygularsa, bunun uygulanan yöntemler listesinde de görüneceğini unutmayın. Yani onları bu sıraya koymak kesinlikle mantıklı.
Drew

Kötü bir uygulama mı?
Muhammed Shamshid

21

Evet yapabilir. Sadece doğru sırayı korumanız gerekiyor.

class database extends mysqli implements databaseInterface { ... }

Dahası, bir sınıf birden fazla arayüz uygulayabilir. Onları virgülle ayırın.

Ancak, mysqli sınıfını genişletmenin inanılmaz derecede kötü bir fikir olduğu konusunda sizi uyarmak zorunda olduğumu hissediyorum . Kalıtım, nesneye yönelik programlamada muhtemelen en fazla abartılan ve yanlış kullanılan kavramdır.

Bunun yerine, db ile ilgili şeyleri mysqli yoluyla (veya PDO yoluyla) yapmanızı öneririm.

Artı, küçük bir şey, ancak adlandırma kuralları önemlidir. Sınıfınız databaseo zaman daha genel görünüyor mysqli, bu nedenle sınıfın databaseyoldan miras aldığını ve yoldan miras aldığını öne sürüyor .


1
Mysqli sınıfını genişletmek neden kötü bir fikir?
Pim Jager

11
Birincisi, çünkü o senin değil. Mysqli adamları bir şeyi değiştirmeye karar verdiğinde, alt sınıfın davranışı da değişecektir. İkinci olarak, kalıtım, ekstra işlevsellikle GENİŞLETMEK için değil ÖZELLEŞTİRMEK için kullanılır. Bu, OOP'de en yanlış anlaşılan şeydir. Genel bir kural olarak, yalnızca soyut sınıfları genişletme eğilimindeyim.
Michał Rudnicki

Michal - polimorfik bir yaklaşım kullanan bir geliştirici için birleştirilmiş / birleştirilmiş bir yaklaşım kullanan bir geliştirici için mysqli'ye yapılan bir değişiklik nasıl farklı olabilir? Değişiklikleri işlemek için yine de kodunuzu güncellemeniz gerekir.
Peter Bailey

2
Adaptör modeline aşinayım. Sadece bir yöntem adı değişirse veya kullanımdan kaldırılırsa, her iki senaryoda da kodu değiştirmeniz gerekeceğini söylüyorum. Bu senaryoda polimorfik olmayan bir yaklaşımın daha iyi olduğu konusunda hemfikir olsam da, bir adaptörün değişime "bağışık" olacağı fikrine inanmıyorum.
Peter Bailey

2
Bu kodu kullanan her yerde değil, yalnızca adaptör kodunu değiştirmeniz gerekecektir. Kompozisyonla, ne olursa olsun uyumluluk katmanı sağlayabilirsiniz, oysa kalıtımla buna en iyi ihtimalle bir hack diyebilirsiniz. Ve düzelttim, adaptör değişime karşı daha iyi bir bağışıklık sağlayacaktır.
Michał Rudnicki

6

evet, aslında birden fazla arayüz uygulamak istiyorsanız, şu şekilde yapabilirsiniz:

public class MyClass extends BaseClass implements myInterface1, myInterface2, myInterface3{ 

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.