PHPのdiff実装は、phpunitからスタンドアロンコンポーネントに因数分解されます。
このライブラリを、作曲家を使用して、プロジェクトにローカルでプロジェクトごとの依存関係として追加できます。
composer require sebastian/diff
開発中にこのライブラリのみが必要な場合は、たとえばプロジェクトのテストスイートを実行するために、開発時間依存関係として追加する必要があります。
composer require --dev sebastian/diff
Differ
クラスを使用して、2つの文字列間の違いのテキスト表現を生成できます。
<?php declare(strict_types = 1); sebastianbergmanndiffdifferを使用; sebastianbergmanndiftunifieddifideddiftputBuilder; $ DIF-> diff( 'foo'、 'bar')を印刷します。
上記のコードは、以下の出力を生成します。
---オリジナル+++ new @@ @@-foo+bar
上記の例で使用されているUnifiedDiffOutputBuilder
は、「Unified Diff」形式で出力を生成し、たとえばPHPunitで使用されます。
StrictUnifiedDiffOutputBuilder
はdiff -u
と同様に、 patch
またはgit apply
適用と互換性がある「Strict Unified Diff」形式でHunkを使用して出力を生成します。
DiffOnlyOutputBuilder
は、異なる線のみを含む出力を生成します。
これらの3つの出力ビルダーがユースケースと一致しない場合、 DiffOutputBuilderInterface
を実装してカスタム出力を生成できます。
Parser
クラスを使用して、統一されたdiffをオブジェクトグラフに解析できます。
sebastianbergmanndiffparserを使用します; sebastianbergmanngit; $ git = new git( '/usr/local/src/money'); $ diff = git-> getDiff( '948A1A07768D8EDD10DCEFA8315C1CBEBBB31833' '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()
を返します。GgetStart getStart()
またはgetEnd()
によって返される線の数は予想よりも低いものです。それは、チャンクを挿入または削除する必要がある行番号です。他のすべての場合において、交換された線の範囲の最初の行番号が与えられます。