2010-03-03 23 views

cevap

9

Bir içeren sınıf iki sınıfları kapsül haline getirilmesi ve örneğin özel değişken

class YourFirstClass { 
    public $variable; 
    private $_variable2; 
    public function setVariable2($a) { 
     $this->_variable2 = $a; 
    } 
} 

class YourSecondClass { 
    public $variable; 
    private $_variable2; 
    public function setVariable2($a) { 
     $this->_variable2 = $a; 
    } 
} 

class ContaingClass { 
    private $_first; 
    private $_second; 
    public function __construct(YourFirstClass $first, YourSecondClass $second) { 
     $this->_first = $first; 
     $this->_second = $second; 
    } 
    public function doSomething($aa) { 
     $this->_first->setVariable2($aa); 
    } 
} 

Research (hakkında) için ayarlayıcılar/alıcılar olarak (ilgili bir arabirim sağlar olmalıdır: "bileşim miras üzerinde"

Dipnot: Yaratıcı olmayan değişken isimler için özür dilerim ..

+0

Hayır, bunu çalışma zamanı yapmalıyım. – user198729

+6

@ user198729: "Çalışma zamanı" gereksiniminizi düşünürsek, gerçekten iki * sınıfı * birleştirmek mi, yoksa iki * nesne * mi demek istediniz? –

0

Bunu çalışma zamanında mı, yoksa programlama saatinde mi yapıyorsunuz?
Çalışma zamanı olduğunu farz edersem, bu durumda c: eşek inheritance?
Birleştirmek istediğiniz ikisinden miras alan yeni bir sınıf oluşturun.

+2

İndirme değil, ama PHP (afaik) çoklu kalıtımını desteklemiyor. – ChristopheD

+1

Bu, devralınan sınıfların özel üyelerine erişim sağlamaz. – tloach

+2

evet, üzgünüm, PHP çoklu kalıtımını desteklemiyor. Bununla birlikte, sınıfları birinden diğerine miras olarak istifleyerek, birden fazla mirasa öykünebilirsiniz. özel üyeleri devralınmayacak, evet. Fakat eğer bu bir sorunsa, korunmalarını kamuoyuna değiştirmek özellikle zor değildir (Özel ihtiyaçların gerçekten gerekip gerekmediği konusunda bir tartışma başlatmayacağız). –

0
# Merge only properties that are shared between the two classes into this object. 
public function conservativeMerge($objectToMerge) 
{ 
    # Makes sure the argument is an object. 
    if(!is_object($objectToMerge)) 
     return FALSE; 

    # Used $this to make sure that only known properties in this class are shared. 
    # Note: You can only iterate over an object as of 5.3.0 or greater. 
    foreach ($this as $property => $value) 
    { 
     # Makes sure that the mering object has this property. 
     if (isset($objectToMerge->$property)) 
     { 
      $objectToMerge->$property = $value; 
     } 
    } 
} 


# Merge all $objectToMerge's properties to this object. 
public function liberalMerge($objectToMerge) 
{ 
    # Makes sure the argument is an object. 
    if(!is_object($objectToMerge)) 
     return FALSE; 

    # Note: You can only iterate over an object as of 5.3.0 or greater. 
    foreach ($objectToMerge as $property => $value) 
    { 
     $objectToMerge->$property = $value; 
    } 
} 

İlk yöntem düşünmelisiniz array_combine() arasında nerede nesne muadili sanki. Daha sonra, ikinci yöntemin, array_merge() için nesne karşılığı nerede olduğunu düşünün.

İlgili konular