2010-03-03 29 views

Respuesta

9

Debe encapsular las clases tanto en una clase que contiene, y proporcionar una interfaz relevante (como setters/getters de las variables privadas

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); 
    } 
} 

Investigación (Google): "composición sobre la herencia"

Nota: lo siento por los nombres de variables no creativas ...

+0

No, necesito hacerlo en tiempo de ejecución. – user198729

+6

@ user198729: Considerando su requisito de "en tiempo de ejecución", ¿realmente quiere fusionar dos * clases *, o quiso decir dos * objetos *? –

0

¿Está pidiendo hacer esto en tiempo de ejecución, o en tiempo de programación?
Voy a asumir el tiempo de ejecución, en cuyo caso ¿qué hay de malo con el uso de cl culo inheritance?
Crea una clase nueva que herede de las dos que deseas fusionar.

+2

No downvoting, pero PHP does not (afaik) admite herencia múltiple. – ChristopheD

+1

Esto no le dará acceso a los miembros privados de las clases heredadas. – tloach

+2

sí, lo siento, PHP no es compatible con herencia múltiple. Sin embargo, al apilar las clases para heredar de una u otra, puede emular herencia múltiple. miembros privados no serán heredados, sí. Pero si esto es un problema, no es particularmente difícil cambiar su protección a pública (no comenzaremos en un debate sobre si lo privado realmente se necesita). –

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; 
    } 
} 

Debe tener en cuenta el primer método como si donde la contraparte objeto de array_combine(). Luego considere el segundo método como si fuera la contraparte del objeto para array_merge().