2011-07-03 26 views
7

Duplicar posibles: sin embargo
Can I extend a class using more than 1 class in PHP?¿Puedes extender dos clases en una clase?

tengo una clase que tiene varias clases hijas, sin embargo ahora estoy añadiendo otra clase, que también quiero ser un hijo de los padres, También me gustaría utilizar muchas de las funciones de una de las otras clases secundarias.

He pensado en mover las funciones respectivas de la otra clase hija a la primaria, sin embargo, no creo que esto sea realmente necesario, ya que solo estas dos clases secundarias las usarían, así que esperaba que Podría extenderme desde la clase principal principal y desde una de las clases secundarias existentes.

Respuesta

9

Puede extender la clase secundaria para heredar sus funciones principales y secundarias, lo que creo que es lo que intenta hacer.

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

Aunque, como otros han dicho, una clase no puede heredar de dos clases a la vez (es decir, 'extiende una, B' o algo así) – alxbl

+0

Eso es lo Estaba pensando en hacerlo, pero entonces no pensé que heredaría cosas del padre principal. En este caso, ¿qué clase es el padre? ¿Cómo accedes a las funciones/métodos del no padre? – Brett

+0

Desde 'Your_Class' puede simplemente llamarlos usando' $ this-> method() 'como de costumbre ... cada miembro' protected' y 'public' se heredará. 'Child' es el padre de' Your_Class' pero por polimorfismo, un tipo de pista de 'Parent' también aceptará un objeto 'Your_Class'. * Agregué un poco de detalle al ejemplo de código para mostrar que * – alxbl

8

Ningún php es lenguaje de herencia único. Si puede, puede buscar la próxima función en php 5.4, eso es rasgos.

2

Como una respuesta sí/no, puedo decir que no. No puede extender desde múltiples clases en php. pero puede usar interface en su lugar.

0

Puede hacer esto pensando hacia atrás, sin embargo, depende de la situación. Si desea mantener sus clases separadas, nadie puede darle una buena respuesta sobre cómo estructurar sus objetos y su herencia a menos que nos brinde más información. También tenga en cuenta que preocuparse demasiado por la correcta estructuración de la clase es una carga en los proyectos pequeños y también puede cambiar los métodos y terminar con ellos y obtener más información sobre las clases más adelante.

8

Como dijo @morphles, esta función estará disponible como rasgos (como mixins en otros idiomas) en php 5.4. Sin embargo, si es realmente necesario, se puede utilizar como solución:

// 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(); 
+0

Gracias por el ejemplo de solución :) – Brett

+0

De nada) Escríbeme si no puede cambiarlo para sus necesidades. – RReverser

+0

¿Funcionaría esto si ComposeAB necesitara implementar una interfaz que especifique funciones en A y B? Imagínese si la interfaz tuviera smthA y smthB, ComposeAB implementara tal interfaz, ¿la función __call satisfaría los requisitos de la interfaz? – CMCDragonkai

Cuestiones relacionadas