2011-07-03 20 views
7

Olası Çoğalt:
Can I extend a class using more than 1 class in PHP?Bir sınıfta iki sınıf genişletebilir misiniz?

ancak ben şimdi de ebeveynin çocuk olmak istiyorum başka bir sınıf ekliyorum, birkaç çocuk sınıfları olan bir sınıf var, ancak Diğer çocuk sınıflarından birinden birçok fonksiyonu kullanmak isterim.

Diğer çocuk sınıfından ebeveynlere ilgili işlevleri taşıdığımı düşünmüştüm, ancak bunun gerçekten ihtiyaç duyduğunu düşünmediğini düşündüm, çünkü sadece bu iki çocuk sınıfının bunları kullanmasını umuyordu. Ana ana sınıftan ve mevcut çocuk sınıflarından birinden uzayabilirim.

cevap

9

Bunu üst ve Ne yapmaya çalışıyorsun budur düşünüyorum çocuğun fonksiyonlarını, hem devralmak için çocuk sınıfını uzatabilirsiniz.

class Parent 
{ 
    protected function _doStuff(); 
} 

class Child extends Parent 
{ 
    protected function _doChildStuff(); 
} 

class Your_Class extends Child 
{ 
    // Access to all of Parent and all of Child's members 
} 

// Your_Class has access to both _doStuff() and _doChildStuff() by inheritance 
+0

Yani: gerçekten ihtiyaç duyulan Ancak, bu tür geçici çözümü kullanabilirsiniz Yapmayı düşünüyordum ama sonra ana ebeveynin eşyalarını alacağını düşünmedim. Bu durumda ebeveyn hangi sınıftır? Ebeveyn olmayanlardan işlevlere/yöntemlere nasıl erişirsiniz? – alxbl

+0

var

// your class #1 class A { function smthA() { echo 'A'; } } // your class #2 class B { function smthB() { echo 'B'; } } // composer class class ComposeAB { // list of implemented classes private $classes = array('A', 'B'); // storage for objects of classes private $objects = array(); // creating all objects function __construct() { foreach($this->classes as $className) $this->objects[] = new $className; } // looking for class method in all the objects function __call($method, $args) { foreach($this->objects as $object) { $callback = array($object, $method); if(is_callable($callback)) return call_user_func_array($callback, $args); } } } $ab = new ComposeAB; $ab->smthA(); $ab->smthB(); 
Brett

+0

'Your_Class' dan sadece' $ this-> method() 'kullanarak bunları her zamanki gibi çağırabilirsiniz ... her' korumalı 've' public 'üyesi miras alınacaktır. 'Child'' Your_Class'ın ebeveyni, fakat polimorfizm ile 'Parent''in bir tür-ipucu' Your_Class' nesnesini de kabul edecektir. * Ben sizin ihtiyaçlarınız için bunu değiştiremezsiniz beni yaz) * geçici çözüm örnek :) – alxbl

8

yok php tek miras dilidir. Eğer yapabilecekseniz, 5.4'te yaklaşan özelliği bulabilirsiniz, bu özellik. evet/i hayır diyebiliriz hiçbir cevap olarak

2

. Php'de birden çok sınıftan genişletemezsiniz. ancak bunun yerine interface'u kullanabilirsiniz.

0

Bunu geriye doğru düşünerek yapabilirsiniz, ancak duruma göre değişir. Derslerinizi ayrı tutmak istiyorsanız, bize daha fazla bilgi vermediğiniz sürece, kimse size nesnelerinizi ve mirasınızı nasıl yapılandıracağınıza dair iyi bir cevap veremez. Ayrıca, sınıf yapısının doğru yapılmasından endişe duymanın küçük projelerdeki bir yük olduğunu aklınızdan çıkarmayın. Ayrıca, bu metotları daha ileriye taşıyabilir ve daha sonra dersler hakkında daha fazla bilgi edinebilirsiniz.

8

olarak @morphles bu özellik php 5.4 de (diğer dillerdeki Mixins gibi) özellikleri olarak satışa sunulacak söyledi. Diğerleri söylediler, bir sınıf aynı anda iki sınıftan devralamaz rağmen

ne (A, B` falan yani `uzanır)
+0

Teşekkür göstermek için kod örneğine ayrıntı biraz ekledi. – Brett

+0

Rica ederim için – RReverser

+0

ComposeAB, A ve B işlevlerini belirten bir arabirimi uygulamak için gerekliyse bu işe yarar mı? Arayüzün smthA ve smthB olup olmadığını düşünün, ComposeAB böyle bir arabirimi uyguladı, __call işlevi arabirimin gereksinimlerini karşılar mı? – CMCDragonkai