2016-03-28 11 views
1

Angenommen, ich habe eine Eigenschaft und eine Klasse, die jeweils eine Methode mit demselben Namen haben, aber die Methode der Klasse ist statisch und die Methode der Eigenschaft nicht. Ist es möglich, eine Klasse zu definieren, die beide von dieser Klasse erbt und das Merkmal verwendet?Wie verwenden Sie eine Eigenschaft mit einer nicht statischen Methode, die mit einer geerbten statischen Methode in Konflikt steht?

In Code, würde dies in etwa so aussehen

trait MyTrait 
{ 
    public function doStuff() 
    { 
     return 'trait'; 
    } 
} 

class ParentClass 
{ 
    public static function doStuff() 
    { 
     return 'parent'; 
    } 
} 

class ChildClass extends ParentClass // I'm feeling really original today apparently 
{ 
    use MyTrait; 
} 

Mein erster Gedanke war es, die Methode auf dem Zug an Alias, wie

class ChildClass extends ParentClass 
{ 
    use MyTrait { 
     doStuff as doOtherStuff; 
    } 
} 

aber es scheint das Merkmal immer noch versucht, die außer Kraft zu setzen Methode von der Elternklasse, so wirft dies einen Fehler

Cannot make static method ParentClass::doStuff() non static in class MyTrait 

Ist was ich versuche zu tun? Wenn das so ist, wie? Und wenn nicht, bitte erkläre warum nicht. Vielen Dank!

EDIT
Leider ist die Methodennamen ändert für mich kein gangbarer Weg, da sowohl die Klasse und das Merkmal ziemlich ausgiebig um andere Teile der Anwendung verwendet werden. Gemäß the PHP docs überschreiben die Methoden des Merkmals immer geerbte Methoden. (Sie können dies am Arbeitsplatz sehen, wenn Sie ParentClass::doStuff ändern, um nicht-statisch zu sein, aber das kann ich auch nicht machen.) Vielleicht frage ich wirklich, ob es möglich ist, die Methode des Merkmals nicht außer Kraft zu setzen statische Methode (was scheint das normale Verhalten zu sein)?

Ich auch ein zweites Merkmal erstellen, die MyTrait::doStuff zu doOtherStuff alias und stattdessen verwenden.

trait MyTrait2 
{ 
    use MyTrait { 
     doStuff as doOtherStuff; 
    } 
} 

class ChildClass extends ParentClass 
{ 
    use MyTrait2; 
} 

Aber das erzeugt den gleichen Fehler, den ich seltsam finde.

Cannot make static method ParentClass::doStuff() non static in class MyTrait2 

Antwort

0

Es ist wahrscheinlich ein Missverständnis. Statische Methoden und nicht-statische Methoden sollten nicht die gleiche Arbeit verrichten und sollten daher unterschiedliche Namen haben. Vielleicht sind Ihre Namen nicht explizit genug.

Sie können das nicht tun, weil beim Erstellen eines Alias ​​sowohl der alte Name als auch der neue Name vorhanden sind. Da "doStuff" noch immer vorhanden ist, entsteht ein Konflikt mit der ParentClass.

Sehen Sie folgendes Beispiel:

trait MyTrait 
{ 
    public function doStuff() 
    { 
     return 'foo'; 
    } 
} 

class Foo 
{ 
    use MyTrait { 
     doStuff as doOtherStuff; 
    } 
} 

echo Foo::doStuff(); // doStuff still works 
+0

Rechts. Ich stimme Ihren Gedanken hier zu und fand heraus, dass, wenn die Methode der Klasse nicht statisch ist, das Merkmal sie außer Kraft setzt. Aber das Ändern der Methodennamen ist für mich keine praktikable Option. Die Elternklasse und das Merkmal werden beide in der ganzen App, mit der ich arbeite, ausgiebig genutzt, also wäre es mühsam, sie zu ändern. –

Verwandte Themen