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和其他類型的生產使用情況。它對應用程序性能的影響很可能很大。此外,雖然沒有知道或預期的與拼湊相關的特定安全風險,但請記住,拼湊為生產環境從未開發出來。