PHP의 Diff 구현, PHPUnit에서 독립형 구성 요소로 고려됩니다.
이 라이브러리를 작곡가를 사용하여 프로젝트에 현지의 프로젝트 별 종속성으로 추가 할 수 있습니다.
composer require sebastian/diff
예를 들어 프로젝트의 테스트 스위트를 실행하기 위해 개발 중에이 라이브러리 만 있으면 개발 시간 종속성으로 추가해야합니다.
composer require --dev sebastian/diff
Differ
클래스는 두 줄의 차이를 텍스트 표현하는 데 사용될 수 있습니다.
<? php declare (strict_types = 1); sebastianbergmanndiffdiffer를 사용하십시오; sebastianbergmanndiffoutunifeDiffoutBuilder 사용; $ differ = new Differ (new UnifiedDiffOutputBuilder); 인쇄 $ diffect-> diff ( 'foo', 'bar');
위의 코드는 아래의 출력을 산출합니다.
--- Original +++ new @@ @@ -Foo+바
위의 예에 사용 된 UnifiedDiffOutputBuilder
는 "Unified Diff"형식으로 출력을 생성하며 PHPUnit에 의해 사용됩니다.
StrictUnifiedDiffOutputBuilder
는 diff -u
와 유사하며 patch
또는 git apply
과 호환되는 덩어리가있는 "Strict Unified Diff"형식으로 출력을 생성합니다.
DiffOnlyOutputBuilder
는 다른 선만 포함하는 출력을 생성합니다.
이 세 가지 출력 빌더 중 어느 것도 유스 케이스와 일치하지 않으면 DiffOutputBuilderInterface
구현하여 사용자 정의 출력을 생성 할 수 있습니다.
Parser
클래스는 통합 된 차이를 객체 그래프로 구문 분석하는 데 사용될 수 있습니다.
sebastianbergmanndiffparser; sebastianbergmanngit; $ git = new git ( '/usr/local/src/money'); $ diff = $ git-> getDiff ( '948A1A07768d8edd10dcefa8315c1cbeffb31833', '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()
리턴 0 인 경우 getStart()
또는 getEnd()
가 반환 한 줄 수는 예상보다 낮습니다. 청크를 삽입하거나 삭제 해야하는 선 번호입니다. 다른 모든 경우에는 교체 된 라인 범위의 첫 번째 줄 번호를 제공합니다.