diff
1.0.0
PHP的DIFF实现将PHPUNIT分为独立组件。
您可以使用Composer将此库作为本地,每项项目依赖性添加到您的项目中:
composer require sebastian/diff
如果您在开发过程中只需要此库,例如,要运行项目的测试套件,则应将其添加为开发时间依赖性:
composer require --dev sebastian/diff
Differ类可用于生成两个字符串之间差异的文本表示:
<?php声明(strict_types = 1);使用sebastianbergmanndiffdiffer;使用sebastianbergmanndiffOutputunifutunifieddiffOutputbuilder; $ difly; $ divel = new drive = new dislift dislift dislifate dislifate dislifate dislifate distric(新的unieddiffOutputbuilder); 打印$ differ-> diff('foo','bar');
上面的代码得出以下输出:
---原始+++ new @@ @@ @@- foo+bar
上面示例中使用的UnifiedDiffOutputBuilder以“统一diff”格式生成输出,例如,phpunit使用。
StrictUnifiedDiffOutputBuilder以Hunks的形式生成“严格统一差异”格式的输出,类似于diff -u ,并且与patch或git apply兼容。
DiffOnlyOutputBuilder生成仅包含不同行的输出。
如果这三个输出构建器都不匹配您的用例,则可以实现DiffOutputBuilderInterface来生成自定义输出。
Parser类可用于将统一的差异解析为对象图:
use SebastianBergmannDiffParser;use SebastianBergmannGit;$git = new Git('/usr/local/src/money');$diff = $git->getDiff( '948a1a07768d8edd10dcefa8315c1cbeffb31833', 'C07A373D2399F3E686234C4F7F088D635EB9641B'); $ PARSER = new Parser; print_r; 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()返回的行数比一个人低一个。这是插入或删除块的行号;在所有其他情况下,它给出了替换线范围的第一行号。