Manchmal muss ich die Großelternmethode ausführen (das heißt, die Elternmethode umgehen), ich weiß, dass das Codegeruch ist, aber manchmal kann ich die anderen Klassen (Frameworks, Bibliotheken usw.) nicht ändern.
In PHP können wir das mit etwas wie:
machen %Vor%Das Problem ist, dass wenn Sie E_STRICT Fehler aktiviert haben, ein Fehler wie folgt angezeigt wird:
Strenge Standards: Nicht-statische Methode GrandParent :: grandParentMethod () sollte nicht statisch in ...
aufgerufen werden Ich habe nur eine Lösung dafür gefunden (ohne E_STRICT zu entfernen) und füge nur @
hinzu, um den Fehler zu unterdrücken.
Aber das ist wirklich hässlich, kennt jemand eine bessere Lösung?
Danke! PS: Ich kann ein neues Objekt wie:
nicht instanziieren %Vor%weil ich meine Großelternmethode im Kontext von $ son aufrufen muss.
Sie können ReflectionMethod- & gt; invoke ()
verwendenBeispiel:
%Vor%Hinweis: Die aufgerufene Methode muss öffentlich sein.
Sie können den Großelternteil direkt mit dem Namen aufrufen (ohne call_user_func
Bindung).
Der Base::getFoo
-Aufruf kann wie ein statischer Aufruf aussehen (wegen der Doppelpunkt ::
-Syntax), ist es jedoch nicht. Genauso wie parent::
auch nicht statisch ist. Das Aufrufen einer Methode aus der Vererbungskette innerhalb einer Klasse bindet den Wert $this
korrekt, ruft sie als reguläre Methode auf, beachtet die Sichtbarkeitsregeln (z. B. protected) und stellt keinerlei Verletzung dar. Es mag zunächst ein wenig peinlich aussehen, aber das ist der Weg, es in PHP zu tun.
Sie können eine separate interne Methode verwenden (z. B. _doStuff
, um doStuff
zu ergänzen) und diese direkt vom Enkel über das Elternelement aufrufen.
zeigt
an %Vor%Tags und Links php inheritance