Implementação de diff para PHP, fatorada fora da phpunit em um componente independente.
Você pode adicionar esta biblioteca como uma dependência local por projeto ao seu projeto usando o Composer:
composer require sebastian/diff
Se você precisar apenas desta biblioteca durante o desenvolvimento, por exemplo, para executar o conjunto de testes do seu projeto, adicione-o como uma dependência em tempo de desenvolvimento:
composer require --dev sebastian/diff
A classe Differ
pode ser usada para gerar uma representação textual da diferença entre duas strings:
<? imprimir $ diferente-> diff ('foo', 'bar');
O código acima gera a saída abaixo:
--- original +++ novo @@ @@-foo+bar
O UnifiedDiffOutputBuilder
usado no exemplo acima gera saída no formato "Unified Diff" e é usado por phpunit, por exemplo.
O StrictUnifiedDiffOutputBuilder
gera saída no formato "rigoroso diff unified Dif" com pedaços, semelhante ao diff -u
e compatível com patch
ou git apply
.
O DiffOnlyOutputBuilder
gera saída que contém apenas as linhas que diferem.
Se nenhum desses três construtores de saída corresponder ao seu caso de uso, você poderá implementar DiffOutputBuilderInterface
para gerar saída personalizada.
A classe Parser
pode ser usada para analisar um diferencial unificado em um gráfico de objetos:
Use sebastianbergmanndiffparser; use sebastianbergmanngit; $ git = new git ('/usr/local/src/money'); $ diff = $ git-> getDiff ('948a1a07768d8edd10dcefa8315cbffbfbfbfb31833d8edd10dcefa8315cre 'C07A373D2399F3E686234C4F7F088D635EB9641B'); $ Parser = new Parser; print_r ($ parser-> parse ($ diff));
O código acima gera a saída abaixo:
Array ( [0] => SebastianBergmannDiffDiff Object ( [from:SebastianBergmannDiffDiff:private] => a/tests/MoneyTest.php [to:SebastianBergmannDiffDiff:private] => b/tests/MoneyTest.php [chunks:SebastianBergmannDiffDiff:private] => Array ( [0] => SebastianBergmannDiffChunk Object ( [start:SebastianBergmannDiffChunk:private] => 87 [startRange:SebastianBergmannDiffChunk:private] => 7 [end:SebastianBergmannDiffChunk:private] => 87 [endRange:SebastianBergmannDiffChunk:private] => 7 [lines:SebastianBergmannDiffChunk:private] => Array ( [0] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 3 [content:SebastianBergmannDiffLine:private] => * @covers SebastianBergmannMoneyMoney::add ) [1] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 3 [content:SebastianBergmannDiffLine:private] => * @covers SebastianBergmannMoneyMoney::newMoney ) [2] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 3 [content:SebastianBergmannDiffLine:private] => */ ) [3] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 2 [content:SebastianBergmannDiffLine:private] => public function testAnotherMoneyWithSameCurrencyObjectCanBeAdded() ) [4] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 1 [content:SebastianBergmannDiffLine:private] => public function testAnotherMoneyObjectWithSameCurrencyCanBeAdded() ) [5] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 3 [content:SebastianBergmannDiffLine:private] => { ) [6] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 3 [content:SebastianBergmannDiffLine:private] => $a = new Money(1, new Currency('EUR')); ) [7] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 3 [content:SebastianBergmannDiffLine:private] => $b = new Money(2, new Currency('EUR')); ) ) ) ) ) )
NOTA: Se o tamanho do pedaço for 0 linhas, ou seja, getStartRange()
ou getEndRange()
retornar 0, o número de linha retornado por getStart()
ou getEnd()
é uma menor do que se poderia esperar. É o número da linha, após o qual o pedaço deve ser inserido ou excluído; Em todos os outros casos, fornece o número de primeira linha da gama substituída de linhas.