2016-07-08 19 views
0

Ich habe eine Klasse, die eine andere Klasse erweitert und ein Merkmal verwendet.Call eigene Methode von Merkmal

class A extends ABase 
{ 
    use MyTrait; 
    //... 
} 

Die erweiterte Klasse (ABase) erstreckt, um eine andere Klasse (ABase2), die eine abstrakte Klasse erweitert (ABase3). Wenn eine Klasse A erstellt wird, wird der Merkmalskonstruktor ausgeführt, da kein Konstruktor in A definiert ist. Gleichzeitig ruft der Merkmalskonstruktor eine Methode auf (configureOptions), die im Merkmal definiert ist, aber auch in der abstrakten Klasse ABase3 mit der gleichen Sichtbarkeit (geschützt).

trait MyTrait 
{ 
    public function __construct($options) 
    { 
     //... 
     $this->configureOptions($resolver); 
     //... 
    } 

    protected function configureOptions($resolver) 
    { 
     // Define options 
    } 
} 

Was ich nicht verstehe, ist, dass, wenn configureOptions aus dem Merkmale genannt wird, ausgeführt das Verfahren nicht das Verfahren, in dem Merkmale definiert ist, sondern die in der abstrakten Klasse definiert (ABase3).

Wie PHP docs sagt: Ein geerbtes Mitglied aus einer Basisklasse wird von einem Mitglied durch eine Eigenschaft eingefügt überschrieben. Die Rangfolge besteht darin, dass Elemente der aktuellen Klasse die Trait-Methoden überschreiben, die wiederum geerbte Methoden außer Kraft setzen.

Sagt nicht nichts über das Aufrufen von Methoden aus demselben Merkmal, aber sollte nicht zuerst nach den Methoden innerhalb seiner eigenen Klasse suchen?

Edit:

Nicht nur die abstrakte Klasse (ABase3) hat die configureOptions Methode, sondern auch die A-Klasse, aber auch hier die Methode aus dem Merkmal genannt sollte die eigene Klasse Methode aufrufen. Ist es nicht?

Antwort

1

Ich habe die Lösung von this answer.

class A extends ABase 
{ 
    use MyTrait { 
     configureOptions as traitConfigureOptions; 
    } 
    //... 
} 

und dann, statt parent::configureOptions($resolver):

$this->traitConfigureOptions($resolver);