Patchwork met en œuvre la redéfinition (correspondance de singe) des fonctions et des méthodes en PHP. Cela inclut à la fois des callables définis par l'utilisateur et internes, qui peuvent être des fonctions, des méthodes de classe ou des méthodes d'instance. De plus, de nombreuses constructions de type fonction, telles que exit
ou include
, sont prises en charge de manière analogue.
En interne, Patchwork utilise un wrapper de flux dans file://
. Dans le cas de fonctions et de méthodes définies par l'utilisateur, il est utilisé pour injecter un simple extrait d'intercepteur au début de tous ces appels. Pour les autres types de callables, diverses autres stratégies sont appliquées.
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()
et restore($handle)
mettent fin à la durée de vie de, respectivement, toutes les redéfinitions, ou une seule, où $handle = redefine(...)
.$this
est automatiquement remis à la classe d'enclusion de la méthode redéfinie.__CLASS__
, static::class
etc. à l'intérieur des redéfinitions ne tient pas compte de la métaphore. getClass()
, getCalledClass()
, getMethod()
et getFunction()
de l'espace de noms Patchwork
doivent être utilisés à la place. Le patchwork peut être utilisé pour couper les méthodes statiques, ce qui, cependant, est une pratique controversée.
Il doit être appliqué prudemment, c'est-à-dire qu'après se familiariser avec ses pièges et ses tentations dans d'autres langages de programmation. Par exemple, dans JavaScript, Ruby, Python et quelques autres, la prise en charge native pour le pistage des singes a rendu ses utilisations liées aux tests plus courantes que dans PHP.
Les tests qui utilisent la mise en œuvre du singe ne sont souvent plus des tests unitaires , car ils deviennent sensibles aux détails de l'implémentation, pas seulement ceux de l'interface: par exemple, un tel test peut ne plus passer après le passage du time()
à DateTime
.
Cela étant dit, ils ont toujours leur place où la seule alternative économiquement viable est de ne pas avoir de tests.
Le patchwork n'est pas suggéré pour AOP et d'autres types d'utilisation de la production. Son impact sur les performances de l'application est très susceptible d'être prohibitif. De plus, bien qu'aucun risque de sécurité lié à la patchwork particulière ne soit connu ou anticipé, veuillez garder à l'esprit que le patchwork n'a jamais été développé en tenant compte des environnements de production.