Aufruf einer geschützten Methode von außerhalb der Klasse in PHP
Habe ich einen ganz besonderen Fall, in dem ich Sie aufrufen müssen, eine geschützte Methode von außerhalb der Klasse. Ich bin sehr bewusst, was ich tun programmingwise, aber ich wäre auch nicht völlig dagegen zu tun, so dass in diesem einen speziellen Fall, den ich habe. In allen anderen Fällen, muss ich weiterhin verbieten den Zugriff auf die interne Methode, und so möchte ich halten, die Methode geschützt.
Was sind einige elegante Möglichkeiten zum Zugriff auf eine geschützte Methode außerhalb einer Klasse? Bisher habe ich gefunden diese.
Ich nehme an, dass es möglich sein kann, eine Art Doppel-agent Instanz der Ziel-Klasse, würde heimlich Zugang zu den Interna...
InformationsquelleAutor Chad Johnson | 2009-06-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
In PHP können Sie dies tun, indem Sie Reflexionen.
Aufrufen, protected oder private Methoden verwenden, die setAccessible () - Methode
http://php.net/reflectionmethod.setaccessible (nur setzen Sie ihn auf TRUE)
InformationsquelleAutor Maria
Ich würde denken, dass in diesem Fall, refactoring, so dass Sie nicht benötigen diese Art der Sache ist wahrscheinlich der eleganteste Weg zu gehen. Zu sagen, dass das eine option ist die Verwendung
__call
und innerhalb, analysierendebug_backtrace
um zu sehen, welche Klasse die Methode aufgerufen hat. Überprüfen Sie dann eine Freunde whitelstIch glaube, ich brauche eine Dusche.
InformationsquelleAutor rojoca
Dies ist ein wenig notdürftigem, könnte aber eine option sein.
Hinzufügen einer Kind-Klasse zum Wohle Zugriff auf die geschützte Funktion
Dann instanziieren eine Instanz der
Child
stattParent
wo Sie anrufen müssen, die Funktion.InformationsquelleAutor Brock Boland
Ich bin einfach nur werfen diese gibt, da ich noch nicht in PHP programmiert in zwei Jahren. Könnten Sie fügen Sie einfach eine Funktion in die Klasse, ruft die protected-Methode wie so?
Bearbeiten:
Ich denke, Tom ist richtig im Blick auf die Dokumentation für create_function. Es sieht aus wie der Umfang der $wird dies "falsch", wenn Sie versuchen, rufen Sie es mit diesem Beispiel.
Sieht es aus wie traditionelle anonyme Funktionen unterstützt seit PHP 5.3.0 als auch (und meine erste Lösung wahrscheinlich nicht funktionieren), so würde ich wahrscheinlich schreiben Sie es wie folgt statt:
Da ich denke, es sieht ein wenig sauberer (und Ihre IDE der Wahl wird, markieren Sie es natürlich besser).
Ugh, ich habe versucht, mit Reflexion die Methode aufrufen, aber PHP wird nicht zulassen, Sie zu tun, dass entweder. Es scheint, dass du gehst zu haben, um mit irgendeiner Art von Kind-Klasse wie der andere Poster vorgeschlagen haben. Wenn Sie eine Methode finden, die funktioniert, die Entwickler werden wahrscheinlich klassifizieren es als bug in die Zukunft und brechen Sie Ihren code, wenn Sie ein upgrade auf die nächste version.
Empfehle ich die Erweiterung der Klasse.
Ich denke, das wird einfach ein string $obj->publicFunc das ist der name der neuen Funktion. Wenn Sie versuchen, es zu nennen den Rahmen ist wie bei einer normalen Funktion.
Ich bin nicht immer dieser arbeiten: chadjohnson.ath.cx:8080/static/anonymous_function.phps. Die Fehler, die ich bekomme, ist "Call to undefined method Tschad::publicFunction()." Was könnte ich falsch gemacht?
Reflexion ist eine gute Idee, in 5.3, die Sie nutzen könnten setAccessible() zu lassen, rufen Sie eine protected-Methode
man kann es auf die Methoden, mithilfe ReflectionMethod statt ReflectionProperty.
InformationsquelleAutor Dave L
Ich würde darüber nachdenken, was die Sache mit dem Programm-design, wenn ich den Aufruf einer eigenen Funktion?
Früher der Fall sein, wenn
Durch das finden alle Weg zu gehen um diese Fragen, werden Sie nirgendwo näher an der wirklichen Lösung.
Auch wenn Sie einige Drittanbieter-API, welche doesn T setzen Sie die Methode, aber Sie definitiv brauchen, Zugang zu dieser Methode. Definitiv ein Gültiger Punkt, Csaba, aber auf sehr seltene Gelegenheiten, die Sie haben können, um die Regeln zu brechen.
InformationsquelleAutor Csaba Kétszeri
Angenommen, Ihre Methode Erklärung geht in etwa so:
Verwendung:
Dies umgeht die protected-Methoden und geht direkt gerade auf die Instanz-Variablen.
InformationsquelleAutor