Implémentation DIFF pour PHP, prise en compte du phpunit dans un composant autonome.
Vous pouvez ajouter cette bibliothèque en tant que dépendance locale par projet à votre projet à l'aide du compositeur:
composer require sebastian/diff
Si vous n'avez besoin que de cette bibliothèque pendant le développement, par exemple pour exécuter la suite de tests de votre projet, vous devez l'ajouter en tant que dépendance à temps de développement:
composer require --dev sebastian/diff
La classe Differ peut être utilisée pour générer une représentation textuelle de la différence entre deux chaînes:
<? PHP Declare (strict_types = 1); utilisez Sebastianbergmanndiffdiffer; utilisez SebastianbergmanndiffoutputUnifieddiffoutputBuilder; $ différente = new Différe (new UnifiedDiffOutputBuilder);
print $ différend-> diff ('foo', 'bar');Le code ci-dessus donne la sortie ci-dessous:
--- Original +++ new @@ @@ - Foo + Bar
Le UnifiedDiffOutputBuilder utilisé dans l'exemple ci-dessus génère la sortie au format "Diff unifié" et est utilisé par PHPUnit, par exemple.
The StrictUnifiedDiffOutputBuilder generates output in "strict unified diff" format with hunks, similar to diff -u and compatible with patch or git apply .
Le DiffOnlyOutputBuilder génère une sortie qui ne contient que les lignes qui diffèrent.
Si aucun de ces trois constructeurs de sortie ne correspond à votre cas d'utilisation, vous pouvez implémenter DiffOutputBuilderInterface pour générer une sortie personnalisée.
La classe Parser peut être utilisée pour analyser un Diff unifié en un graphique d'objet:
Utilisez SebastianbergmanndiffParser; Utilisez Sebastianbergmanngit; $ git = new git ('/ usr / local / src / monery'); $ diff = $ git-> getDiff ('948a1a07768d8edd10dcefa8315c1cbeffb31833',, 'C07A373D2399F3E686234C4F7F088D635EB9641B'); $ parser = new Parser; print_r ($ parser-> parse ($ diff));Le code ci-dessus donne la sortie ci-dessous:
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'));
)
)
)
)
)
) Remarque: Si la taille du morceau est de 0 lignes, c'est-à-dire getStartRange() ou getEndRange() Retour 0, le nombre de lignes renvoyés par getStart() ou getEnd() est inférieur à ce qu'on s'attend. C'est le numéro de ligne, après quoi le morceau doit être inséré ou supprimé; Dans tous les autres cas, il donne le premier numéro de ligne de la plage de lignes remplacée.