Питчер реализует переосмысление (обезьян) функций и методов в PHP. Это включает в себя как пользовательские, так и внутренние Callables, которые могут быть функциями, методами класса или методами экземпляра. Кроме того, многие функциональные конструкции, такие как exit
или include
, поддерживаются аналогичным образом.
Внутренне, Patchwork использует потоковую обертку в file://
. В случае определенных пользовательских функций и методов он используется для введения простого фрагмента перехвата в начало каждого такого призывного. Для оставшихся типов Callables применяются различные другие стратегии.
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
и т. Д. Внутри переосмысления игнорирует метафору. getClass()
, getCalledClass()
, getMethod()
и getFunction()
из пространства имен Patchwork
следует использовать. Питчер может использоваться для загрязнения статических методов, которые, однако, являются противоречивой практикой.
Это должно применяться осторожно, то есть только после того, как ознакомьтесь с его подводными камнями и искушениями на других языках программирования. Например, в JavaScript, Ruby, Python и некоторых других, нативная поддержка для обезьянного перевода сделала свое использование, связанное с тестированием более обычным явлением, чем в PHP.
Тесты, которые используют обезьяны, часто больше не являются модульными тестами, поскольку они становятся чувствительными к деталям реализации, а не только в интерфейсе: например, такой тест больше не может пройти после переключения со time()
в DateTime
.
Тем не менее, у них все еще есть свое место, где единственной экономически жизнеспособной альтернативой является вообще не испытать тестов.
Панчание не предлагается для AOP и других видов использования производства. Его влияние на производительность приложения, вероятно, будет чрезмерно большим. Кроме того, хотя никаких конкретных рисков безопасности, связанных с ломтиками, не известны или ожидают, пожалуйста, имейте в виду, что лоскутное одеяло никогда не было разработано с учетом производственной среды.