Patchwork implementa la redefinición (emparejamiento de mono) de funciones y métodos en PHP. Esto incluye los llamados internos definidos por el usuario e internos, que pueden ser funciones, métodos de clase o métodos de instancia. Además, muchas construcciones similares a la función, como exit
o include
, son compatibles de una manera análoga.
Internamente, Patchwork utiliza un envoltorio de transmisión en file://
. En el caso de las funciones y métodos definidos por el usuario, se utiliza para inyectar un fragmento de interceptor simple al comienzo de cada uno de estos llamables. Para los tipos restantes de llamadas, se aplican varias otras estrategias.
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()
y restore($handle)
finalizan la vida útil de, respectivamente, todas las redefiniciones, o solo una de ellas, donde $handle = redefine(...)
.$this
se vuelve a vincular automáticamente a la clase de adjunto del método que se está redefiniendo.__CLASS__
, static::class
, etc. Inside RedeFinitions ignora la metáfora. getClass()
, getCalledClass()
, getMethod()
y getFunction()
desde el espacio de nombres Patchwork
debe usarse en su lugar. El mosaico se puede utilizar para agitar métodos estáticos, que, sin embargo, es una práctica controvertida.
Debe aplicarse con prudencia, es decir, solo después de familiarizarse con sus dificultades y tentaciones en otros lenguajes de programación. Por ejemplo, en JavaScript, Ruby, Python y algunos otros, el soporte nativo para el parche de mono ha hecho que sus usos relacionados con las pruebas sean más comunes que en PHP.
Las pruebas que usan el parche de mono a menudo ya no son pruebas unitarias , ya que se vuelven sensibles a los detalles de la implementación, no solo las de la interfaz: por ejemplo, dicha prueba ya no puede pasar después de cambiar de time()
a DateTime
.
Dicho esto, todavía tienen su lugar donde la única alternativa económicamente viable es no tener pruebas en absoluto.
El mosaico no se sugiere para AOP y otros tipos de uso de producción. Es muy probable que su impacto en el rendimiento de la aplicación sea prohibitivamente grande. Además, si bien no se conocen o anticipan riesgos de seguridad relacionados con el mosaico particular , tenga en cuenta que el mosaico nunca se desarrolló teniendo en cuenta los entornos de producción.