È possibile l'ereditarietà multipla a livello di classe in PHP?L'ereditarietà multipla è consentita a livello di classe in PHP?
risposta
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:
Ottima descrizione Grazie Gordon !!! –
wooooooo, grafica! +1. –
PHP non supporta l'ereditarietà multipla.
PHP non supporta l'ereditarietà multipla per le classi.
"Non supporta l'ereditarietà multipla"? Quindi, questo significa che lo fa, giusto? –
Non dovresti averlo corretto ora? – mega6382
No, classi PHP possono ereditare una sola classe, non di più.
è 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);
}
}
Elaborazione PLs Ho capito il punto di cui stai parlando ... –
Quale punto? Il punto is_a? O la delegazione? –
Entrambi Pls eloborate Entrambi i punti, io sono un nuovo codificatore non consapevole di questi concetti –
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
- 1. direttiva map nginx: perché è consentita solo a livello http?
- 2. Modello di ereditarietà multipla Classe
- 3. Documentare l'ereditarietà multipla di PHP con PhpDoc
- 4. Creazione di un'istanza di classe dinamica a livello di codice in PHP con argomenti variabili?
- 5. Classe pubblica è inaccessibile a causa del livello di protezione
- 6. Configurazione @Path a livello di classe e livello metodo
- 7. annotazioni a livello di classe vs interfacce
- 8. ereditarietà multipla classe base ambiguo
- 9. Perché l'inizializzazione dei riferimenti a null è consentita in Java?
- 10. classe astratta + mixin + ereditarietà multipla in python
- 11. L'assegnazione di un numero a std :: string è ora consentita?
- 12. Implementare la sicurezza a livello di firma sui servizi Android con più di una firma consentita
- 13. L'azione richiesta non è consentita. Codigniter
- 14. confronto delle immagini a livello di codice - lib o classe
- 15. Perché una virgola extra non è consentita in un elenco di parametri quando è consentita in un'inizializzazione di controvento?
- 16. Namespace PHP: salire di livello?
- 17. Importa stessa classe a livello mondiale
- 18. PHP istanza di classe a JSON
- 19. La trasmissione a vuoto (non il puntatore) è consentita, perché?
- 20. chiamata multipla a startforeground?
- 21. privato classe base e l'ereditarietà multipla
- 22. sostituzione di classe in php
- 23. Questa ottimizzazione ridondante di carico/archivio è consentita in C99?
- 24. è possibile assegnare una funzione a una variabile di classe in fase di runtime in php?
- 25. Istogramma della classe di stampa a livello di programmazione
- 26. È possibile utilizzare l'annotazione @group a livello di classe in phpunit
- 27. Geometria a vista multipla
- 28. È consentita un'applicazione di scripting in Windows Store?
- 29. ereditarietà multipla colata dalla classe base alla diversa classe derivata
- 30. Ricerca multipla in Lucene
Eventuali duplicati, http: // StackOverflow.it/questions/90982/multiple-inheritance-in-php –
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