2010-04-22 12 views
14

È possibile l'ereditarietà multipla a livello di classe in PHP?L'ereditarietà multipla è consentita a livello di classe in PHP?

+0

Eventuali duplicati, http: // StackOverflow.it/questions/90982/multiple-inheritance-in-php –

+0

Credo che la risposta accettata dovrebbe cambiare qui, perché c'è una soluzione alternativa per l'ereditarietà multipla in PHP. Che è descritto in [questa risposta] (https://stackoverflow.com/a/46905316/2394254) ma non nella risposta accettata. – mega6382

risposta

32

L'ereditarietà soffre dello Diamond Problem, che non è stato ancora risolto (concordato come essere) in PHP. Pertanto, non esiste un'eredità multipla in PHP.

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

Se entrambi ClassA e ClassB definito il proprio metodo foo(), quale sarebbe chiamarti in ClassC?

Siete invitati a usare sia object composition o interfaces (che Impedire l'ereditarietà multipla) o - se siete dopo il riutilizzo orizzontale - guardare nel modello Decorator o Strategy finché non avremo Traits (o Grafts o qualsiasi altra cosa saranno chiamati poi).

Alcuni Riferimento:

+2

Ottima descrizione Grazie Gordon !!! –

+2

wooooooo, grafica! +1. –

4

PHP non supporta l'ereditarietà multipla.

-3

PHP non supporta l'ereditarietà multipla per le classi.

+3

"Non supporta l'ereditarietà multipla"? Quindi, questo significa che lo fa, giusto? –

+0

Non dovresti averlo corretto ora? – mega6382

2

No, classi PHP possono ereditare una sola classe, non di più.

3

è possibile simulare utilizzando metodi e le proprietà della delegazione, ma non funziona 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

Elaborazione PLs Ho capito il punto di cui stai parlando ... –

+0

Quale punto? Il punto is_a? O la delegazione? –

+0

Entrambi Pls eloborate Entrambi i punti, io sono un nuovo codificatore non consapevole di questi concetti –

1

PHP non supporta l'ereditarietà multipla in quanto tale, ma fornisce una certa facilità di riutilizzare gruppi di metodi in più classi indipendenti, utilizzando traits. Un trait viene scritto come una classe, ma non può essere istanziato da solo.

di seguito sono un paio di esempi da manuale PHP:

precedenza Esempio d'ordine:

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

uscita:

Hello World! 

Ecco un altro esempio nella risoluzione di conflitti:

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

Per ulteriori informazioni e una comprensione più approfondita di Inhertance multipla in PHP.

Guardare in Horizontal Reuse for PHP

Problemi correlati