patchwork
Version 2.2.0
Patchwork在PHP中实现了功能和方法的重新定义(猴子绘制)。这包括用户定义和内部可可,可以是函数,类方法或实例方法。另外,许多类似功能的构建体(例如exit
或include
)都以类似的方式支持。
在内部,PatchWork使用file://
流包装器。对于用户定义的功能和方法,它用于将简单的拦截器摘要注入到每个可呼叫的开头。对于其余类型的可山,还采用了其他各种策略。
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()
和restore($handle)
分别结束所有重新定义的寿命,或者仅结束其中一个,其中$handle = redefine(...)
。$this
将自动重新限制为重新定义的方法的封闭类。__CLASS__
, static::class
等的行为重新定义内部无视隐喻。应该使用Patchwork
名称空间中的getClass()
, getCalledClass()
, getMethod()
和getFunction()
。 拼布可以用于存根静态方法,但是,这是一种有争议的做法。
它应该谨慎地应用,也就是说,只有在熟悉其他编程语言的陷阱和诱惑之后。例如,在JavaScript,Ruby,Python和其他一些中,对猴子捕获的本机支持使其与测试相关的用途比PHP更普遍。
使用Monkey-Patching的测试通常不再是单位测试,因为它们对实现的详细信息敏感,不仅是接口的详细信息:例如,此类测试在从time()
转换为DateTime
之后都可能不再通过。
话虽如此,他们仍然拥有自己的位置,唯一可行的替代方案根本没有测试。
不建议使用AOP和其他类型的生产使用情况。它对应用程序性能的影响很可能很大。此外,虽然没有知道或预期的与拼凑相关的特定安全风险,但请记住,拼凑为生产环境从未开发出来。