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.