Patchwork mengimplementasikan redefinisi (pitching monyet) dari fungsi dan metode dalam PHP. Ini termasuk callable yang ditentukan pengguna dan internal, yang dapat berupa fungsi, metode kelas, atau metode instance. Selain itu, banyak konstruksi seperti fungsi, seperti exit
atau include
, didukung dengan cara analog.
Secara internal, tambal sulam menggunakan pembungkus aliran pada file://
. Dalam hal fungsi dan metode yang ditentukan pengguna, ini digunakan untuk menyuntikkan cuplikan interseptor sederhana ke awal dari setiap hal yang dapat dipanggil. Untuk jenis callable yang tersisa, berbagai strategi lain diterapkan.
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()
dan restore($handle)
akhiri seumur hidup, masing -masing, semua redefinisi, atau hanya satu dari mereka, di mana $handle = redefine(...)
.$this
secara otomatis terikat kembali ke kelas yang melampirkan metode yang sedang didefinisikan ulang.__CLASS__
, static::class
dll. Di dalam redefinisi mengabaikan metafora. getClass()
, getCalledClass()
, getMethod()
dan getFunction()
dari namespace Patchwork
harus digunakan sebagai gantinya. Patchwork dapat digunakan untuk mensehkan metode statis, yang, bagaimanapun, merupakan praktik kontroversial.
Itu harus diterapkan dengan bijaksana, yaitu, hanya setelah membuat diri sendiri akrab dengan jebakan dan godaannya dalam bahasa pemrograman lainnya. Misalnya, dalam JavaScript, Ruby, Python dan beberapa lainnya, dukungan asli untuk pengambilan monyet telah membuat penggunaan terkait pengujiannya lebih umum daripada di PHP.
Tes yang menggunakan pengambilan monyet seringkali tidak lagi merupakan tes unit , karena mereka menjadi peka terhadap detail implementasi, tidak hanya antarmuka: misalnya, tes seperti itu mungkin tidak lagi lulus setelah beralih dari time()
ke DateTime
.
Yang sedang berkata, mereka masih memiliki tempat di mana satu -satunya alternatif yang layak secara ekonomi adalah tidak memiliki tes sama sekali.
Patchwork tidak disarankan untuk AOP dan jenis penggunaan produksi lainnya. Dampaknya pada kinerja aplikasi sangat mungkin sangat besar. Selain itu, sementara tidak ada risiko keamanan terkait tambal sulam tertentu yang diketahui atau diantisipasi, harap diingat bahwa tambal sulam tidak pernah dikembangkan dengan lingkungan produksi dalam pikiran.