Patchwork implementiert die Neudefinition (Affenpatching) von Funktionen und Methoden in PHP. Dies schließt sowohl benutzerdefinierte als auch interne Anruflinge ein, die Funktionen, Klassenmethoden oder Instanzmethoden sein können. Darüber hinaus werden viele funktionsähnliche Konstrukte, wie z. B. exit
oder include
, auf analoge Weise unterstützt.
Innen verwendet Patchwork einen Stream -Wrapper in file://
. Bei benutzerdefinierten Funktionen und Methoden wird es verwendet, um dem Beginn eines solchen Anrufs einen einfachen Interceptor-Snippet zu verleihen. Für die verbleibenden Arten von Anrufleuten werden verschiedene andere Strategien angewendet.
use function Patchwork {redefine, relay, getMethod};
$ profiling = fopen ( ' profiling.csv ' , ' w ' );
redefine ( ' App* ' , function (... $ args ) use ( $ profiling ) {
$ begin = microtime ( true );
relay (); # calls the original definition
$ end = microtime ( true );
fputcsv ( $ profiling , [ getMethod (), $ end - $ begin ]);
});
restoreAll()
und restore($handle)
beenden die Lebensdauer von allen Neudefinitionen oder nur einer von ihnen, wobei $handle = redefine(...)
.$this
wird automatisch wieder auf die umschließende Klasse der neu definierten Methode zurückgezogen.__CLASS__
, static::class
usw. Inside Neudefinition ignoriert die Metapher. getClass()
, getCalledClass()
, getMethod()
und getFunction()
aus dem Patchwork
-Namespace sollten stattdessen verwendet werden. Patchwork kann verwendet werden, um statische Methoden zu stechen, was jedoch eine kontroverse Praxis ist.
Es sollte vorsichtig angewendet werden, dh erst, nachdem er sich mit seinen Fallstricks und Versuchungen in anderen Programmiersprachen vertraut gemacht hat. Zum Beispiel hat in JavaScript, Ruby, Python und einigen anderen die native Unterstützung für das Affenpatching seine testbezogenen Verwendungszwecke mehr als in PHP gemacht.
Tests, bei denen Monkey-Patching verwendet wird, sind häufig keine Unit -Tests mehr, da sie auf Details der Implementierung sensibel sind, nicht nur die der Schnittstelle: Beispielsweise kann ein solcher Test nicht mehr nach dem Umschalten von time()
auf DateTime
bestehen.
Davon abgesehen haben sie immer noch ihren Platz, an dem die einzige wirtschaftlich tragfähige Alternative darin besteht, überhaupt keine Tests zu haben.
Patchwork wird für AOP und andere Arten von Produktionsverbrauch nicht vorgeschlagen. Die Auswirkungen auf die Leistung der Anwendung sind höchstwahrscheinlich unerschwinglich groß. Obwohl kein bestimmtes Patchwork-bezogene Sicherheitsrisiken entweder bekannt oder erwartet ist, denken Sie bitte daran, dass Patchwork niemals mit den Produktionsumgebungen entwickelt wurde.