2010-04-22 5 views
14

¿Se permite la herencia múltiple a nivel de clase en PHP?¿Se permite la herencia múltiple a nivel de clase en PHP?

+0

duplicado Posible, http: // stackoverflow.com/questions/90982/multiple-inheritance-in-php –

+0

Creo que la respuesta aceptada debería cambiar aquí, porque hay una solución alternativa para 'inheritance multiple' en PHP. Que se describe en [esta respuesta] (https://stackoverflow.com/a/46905316/2394254) pero no en la respuesta aceptada. – mega6382

Respuesta

32

Herencia múltiple sufre de Diamond Problem, que aún no se ha acordado (cómo se resuelve) en PHP. Por lo tanto, no hay herencia múltiple en PHP.

BaseClass 
     /\ 
    /\ 
ClassA ClassB 
     \/
     \/ 
    ClassC 

Si tanto ClassA y ClassB define su propio método foo(), que se podría llamar en ClassC?

Se le anima a cualquiera utilizar object composition o interfaces (que sí permiten herencia múltiple) o - si usted está después de reutilización horizontal - mirar en el patrón Decorator o Strategy hasta que tengamos Traits (o Grafts o lo que serán llamados a continuación,)

Algunos Referencia:

+2

Excelente descripción Gracias Gordon !!! –

+2

wooooooo, gráficos! +1. –

4

PHP no es compatible con herencia múltiple.

-3

PHP no es compatible con herencia múltiple para las clases.

+3

"No admite herencia múltiple"? Entonces, eso significa que sí, ¿no? –

+0

¿No debería haber corregido esto ahora? – mega6382

2

No, clases PHP sólo pueden heredar una clase, no múltiple.

3

puede imitar usando el método y la propiedad delegación, pero no va a trabajar con is_a() o instanceof:

class A extends B 
{ 
    public function __construct($otherParent) 
    { 
     $this->otherParent = $otherParent; 
    } 

    public function __call($method, $args) 
    { 
     $method = array($this->otherParent, $method); 

     return call_user_func_array($method, $args); 
    } 
} 
+0

PLs elaborados Dindt entendió el punto que está hablando de ... –

+0

¿Qué punto? ¿El punto is_a? ¿O la delegación? –

+0

Both Pls eloborate Both point, soy un nuevo codificador que no conoce estos conceptos –

1

PHP no soporta la herencia múltiple como tal, pero proporciona cierta facilidad para reutilizar conjuntos de métodos en múltiples clases independientes, usando traits. Un trait se escribe como una clase, pero no se puede crear una instancia por sí mismo.

a continuación son un par de ejemplos de PHP Manual:

Precedencia Ejemplo de pedido:

class Base { 
    public function sayHello() { 
     echo 'Hello '; 
    } 
} 

trait SayWorld { 
    public function sayHello() { 
     parent::sayHello(); 
     echo 'World!'; 
    } 
} 

class MyHelloWorld extends Base { 
    use SayWorld; 
} 

$o = new MyHelloWorld(); 
$o->sayHello(); 

Salida:

Hello World! 

Aquí es otro ejemplo con la resolución de conflictos:

trait A { 
    public function smallTalk() { 
     echo 'a'; 
    } 
    public function bigTalk() { 
     echo 'A'; 
    } 
} 

trait B { 
    public function smallTalk() { 
     echo 'b'; 
    } 
    public function bigTalk() { 
     echo 'B'; 
    } 
} 

class Talker { 
    use A, B { 
     B::smallTalk insteadof A; 
     A::bigTalk insteadof B; 
    } 
} 

class Aliased_Talker { 
    use A, B { 
     B::smallTalk insteadof A; 
     A::bigTalk insteadof B; 
     B::bigTalk as talk; 
    } 
} 

Para obtener más información y una comprensión más profunda de Multiple Inhertance en PHP.

Mira en Horizontal Reuse for PHP

Cuestiones relacionadas