È 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
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