パッチワークは、PHPの機能と方法の再定義(モンキーパッチ)を実装します。これには、関数、クラスの方法、またはインスタンスメソッドなど、ユーザー定義と内部の両方の呼び出しが含まれます。さらに、 exit
include
の多くの機能様コンストラクトは、類似の方法でサポートされています。
内部的には、パッチワークは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(...)
定義、またはそのうちの1つのみを終了します。$this
、再定義されているメソッドの囲まれたクラスに自動的に再バウンドされます。__CLASS__
、 static::class
などの動作。内部の再定義は、比phorを無視します。 getClass()
、 getCalledClass()
、 getMethod()
、およびgetFunction()
Patchwork
に使用する必要があります。 パッチワークは静的方法をスタブに使用することができますが、これは物議を醸す実践です。
それは慎重に、つまり、他のプログラミング言語での落とし穴や誘惑に精通した後にのみ、適用する必要があります。たとえば、JavaScript、Ruby、Pythonなどでは、Monkey-Patchingのネイティブサポートにより、PHPよりもテスト関連の使用が一般的になりました。
モンキーパッチングを使用するテストは、インターフェイスの詳細だけでなく、実装の詳細に敏感になるため、単位テストではなくなることがよくあります。たとえば、このようなテストは、 time()
からDateTime
に切り替えた後に渡されなくなる可能性があります。
そうは言っても、彼らはまだ経済的に実行可能な唯一の選択肢がテストをまったく持っていないという彼らの場所を持っています。
AOPおよびその他の種類の生産使用については、パッチワークは提案されていません。アプリケーションのパフォーマンスへの影響は、非常に大きくなる可能性が非常に高いです。さらに、特定のパッチワーク関連のセキュリティリスクは既知または予想されるものはありませんが、生産環境を念頭に置いてパッチワークが開発されたことはないことに留意してください。