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()によって返される線の数は予想よりも低いものです。それは、チャンクを挿入または削除する必要がある行番号です。他のすべての場合において、交換された線の範囲の最初の行番号が与えられます。