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
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. –