A colcha de retalhos implementa a redefinição (deputamento de macacos) de funções e métodos no PHP. Isso inclui callabes internos e definidos pelo usuário, que podem ser funções, métodos de classe ou métodos de instância. Além disso, muitas construções semelhantes a funções, como exit
ou include
, são suportadas de maneira análoga.
Internamente, o patchwork usa um invólucro de fluxo em file://
. No caso de funções e métodos definidos pelo usuário, ele é usado para injetar um snippet interceptador simples no início de todos os chamados. Para os tipos restantes de chamáveis, várias outras estratégias são aplicadas.
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()
e restore($handle)
terminam a vida útil de, respectivamente, todas as redefinições, ou apenas uma delas, onde $handle = redefine(...)
.$this
é automaticamente re-limitado para a classe anexante do método que está sendo redefinido.__CLASS__
, static::class
etc. interna redefinições desconsidera a metáfora. getClass()
, getCalledClass()
, getMethod()
e getFunction()
do espaço para nome Patchwork
devem ser usados. A coleta de retalhos pode ser usada para extrair métodos estáticos, que, no entanto, é uma prática controversa.
Deve ser aplicado com prudência, isto é, somente depois de se familiarizar com suas armadilhas e tentações em outras linguagens de programação. Por exemplo, em JavaScript, Ruby, Python e alguns outros, o suporte nativo para o patching de macacos tornou seus usos relacionados a testes mais comuns do que no PHP.
Os testes que usam o patch de macacos geralmente não são mais testes de unidade , porque se tornam sensíveis a detalhes da implementação, não apenas os da interface: por exemplo, esse teste pode não passar mais após a troca de time()
para DateTime
.
Dito isto, eles ainda têm seu lugar onde a única alternativa economicamente viável é não fazer testes.
O retalhos não é sugerido para a AOP e outros tipos de uso da produção. Seu impacto no desempenho do aplicativo provavelmente será proibitivamente grande. Além disso, embora nenhum riscos de segurança relacionados a retalhos específicos sejam conhecidos ou antecipados, lembre-se de que a retalhos nunca foi desenvolvida com os ambientes de produção em mente.