Ändere eine Methode / Funktion zur Laufzeit

8

Ich habe mir die php-Reflektionsmethoden angeschaut, was ich tun möchte, ist etwas Code einzufügen, nachdem die Methode geöffnet wurde und bevor irgendein Rückgabewert, zum Beispiel, ich möchte ändern:

%Vor%

Und injiziere Code wie:

%Vor%

möglich?

    
mononym 28.05.2010, 18:56
quelle

7 Antworten

2

Schauen Sie sich anonyme Funktionen an. Wenn Sie PHP 5.3 ausführen können, könnte das mehr mit dem zu tun haben, was Sie versuchen zu tun.

    
Jarrod Nettles 28.05.2010, 19:04
quelle
4

Nun, ein Weg wäre, alle Methodenaufrufe "virtuell" zu machen:

%Vor%

PHP 5.2:

%Vor%

PHP 5.3:

%Vor%

Alles PHP:

%Vor%

Er übergibt die Instanz des Objekts als erste Methode an die "Überschreibung". Hinweis: Diese "überschriebene" Methode hat keinen Zugriff auf geschützte Mitglieder der Klasse. Also benutze getters ( __get , __set ). Es wird Zugriff auf geschützte Methoden haben, da der eigentliche Aufruf von __call() ...

kommt

Hinweis: Sie müssen alle Standardmethoden so ändern, dass ihnen ein _ vorangestellt wird, damit dies funktioniert ... (oder Sie können eine andere Präfixoption wählen, oder Sie können einfach scope sie alle geschützt) ...

    
ircmaxell 28.05.2010 19:26
quelle
2

Das ist nicht möglich, zumindest nicht so, wie du es willst. Wie im Kommentar vorgeschlagen, dient die Reflexion dazu, Informationen über Klassen / Funktionen zu erhalten und nicht zu ändern.

Es gibt eine PHP-Erweiterung namens Runkit, von der ich glaube, dass sie diese Art von Funktionalität bietet - Ссылка Dies wird jedoch nicht standardmäßig bei den meisten Hosts installiert.

Es kann jedoch eine andere Möglichkeit geben, dies zu tun. Vielleicht könnten Sie, wenn Sie weitere Informationen darüber geben könnten, was Sie versuchen, und warum Sie die fragliche Funktion nicht ändern können, einige Hinweise geben. Z.B. ist die Funktion, die Sie eine Kern-PHP-Funktion ändern möchten, oder Code in einer Drittanbieter-Bibliothek, die Sie nicht bearbeiten möchten?

    
Tim Fountain 28.05.2010 19:08
quelle
0

Nur eine Idee:

%Vor%     
Andreas 28.05.2010 19:10
quelle
0

Sie könnten einen speziellen Autoloader vor dem ursprünglichen Autoloader hinzufügen, die Datei lesen, die Ihr ursprüngliches Autoload laden würde, den Inhalt ändern, diese Datei woanders speichern (etwas tmp dir) und diese modifizierte Datei anstelle des ursprünglichen einfügen .

    
Enrique 06.05.2014 02:12
quelle
0

Ich wollte genau dasselbe machen, also habe ich eine generische Instrumentierungsklasse erstellt, die die Klasse ersetzen würde, die ich zu instrumentieren versuchte, und die @ircmaxell-Technik nutzte, die sie durch die zu instrumentierende Klasse aufrufen würde.

%Vor%

Angenommen, Sie hatten eine Instanz einer Klasse wie $myClass , die die Funktion foo hatte, dann würden Sie so etwas tun:

%Vor%

Der Aufruf von $myClass->foo($bar) würde genauso funktionieren (mit den gleichen Vorbehalten wie die Antwort von @ircmaxell), wenn $instrumentationOn % true oder false ist. Wenn es true ist, würde es einfach das zusätzliche Timing-Zeug machen.

    
cjbarth 02.11.2015 21:45
quelle
-1

Vielleicht verpasse ich etwas, aber willst du wirklich Code "injizieren", wie du sagst? Was versuchst du zu erreichen? Wenn Sie einfach einen Block Code ausführen wollen, wenn A passiert, und einen anderen, wenn B passiert, dann brauchen Sie nur eine einfache Programmierlogik, wie eine if () -Anweisung.

Versuchen Sie wirklich, eine Funktion zur Laufzeit zu ändern? Oder ist das nur ein logisches Problem?

Seien Sie genauer, was Sie tun müssen.

    
Logic Artist 28.05.2010 19:53
quelle

Tags und Links