Реализация DIFF для PHP, учитывая из фпунита в отдельный компонент.
Вы можете добавить эту библиотеку в качестве локальной зависимости от проекта в ваш проект с помощью композитора:
composer require sebastian/diff
Если вам нужна эта библиотека только во время разработки, например, для запуска тестового набора проекта, то вы должны добавить ее в качестве зависимости от времени разработки:
composer require --dev sebastian/diff
Differ
класс может быть использован для создания текстового представления разницы между двумя строками:
<? Php Declare (strict_types = 1); используйте Sebastianbergmanndiffdiffer; используйте Sebastianbergmanndiffutputulifieddiffutputbuilder; $ отличается = новое различие (new UnifiedDiffOutputBuilder); print $ diffice-> diff ('foo', 'bar');
Приведенный выше код дает вывод ниже:
--- Original +++ new @@ @@-foo+bar
UnifiedDiffOutputBuilder
используемый в приведенном выше примере, генерирует выход в формате «Unified Diff» и используется PhpUnit, например.
StrictUnifiedDiffOutputBuilder
генерирует выход в «строгой унифицированной дифференциальной» формате с хрупками, аналогично diff -u
и совместимо с применением patch
или git apply
.
DiffOnlyOutputBuilder
генерирует выход, который содержит только линии, которые различаются.
Если ни один из этих трех выходных строителей не соответствует вашим вашим варианту использования, вы можете реализовать DiffOutputBuilderInterface
для создания пользовательского вывода.
Класс Parser
может быть использован для анализа единой дифференциации в график объекта:
Используйте Sebastianbergmanndiffparser; Использовать Sebastianbergmanngit; $ git = new Git ('/usr/local/src/money'); $ diff = $ git-> getdiff ('948a1a07768d8eddd10dcefa8315c1cbeffb31833', 'C07A373D2399F3E686234C4F7F088D635EB9641B'); $ parser = new Parser; print_r ($ parser-> parse ($ diff));
Приведенный выше код дает вывод ниже:
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')); ) ) ) ) ) )
ПРИМЕЧАНИЕ. Если размер чанка составляет 0 строк, то есть getStartRange()
или getEndRange()
return 0, количество линии, возвращаемого getStart()
или getEnd()
, на один ниже, чем можно было бы ожидать. Это номер строки, после которого кусок должен быть вставлен или удален; Во всех других случаях он дает первую строку номер замененного диапазона линий.