تنفيذ DIF لـ PHP ، الذي تم تأسيسه من phpunit إلى مكون مستقل.
يمكنك إضافة هذه المكتبة كاعتماد محلي لكل مشروع على مشروعك باستخدام الملحن:
composer require sebastian/diff
إذا كنت بحاجة فقط إلى هذه المكتبة أثناء التطوير ، على سبيل المثال لتشغيل مجموعة اختبار مشروعك ، فيجب عليك إضافتها كاعتماد على وقت التطوير:
composer require --dev sebastian/diff
يمكن استخدام فئة Differ لإنشاء تمثيل نصي للفرق بين سلسلتين:
<؟ php denare (strict_types = 1) ؛ استخدم sebastianbergmanndiffdiffer ؛ استخدم sebastianbergmanndiffoutputunifunifieddiffoutputbuilder ؛ $ differ = جديد (جديد diffoutputbuilder) ؛
print $ differ> diff ('foo' ، 'bar') ؛الرمز أعلاه يعطي الإخراج أدناه:
--- الأصلي +++ جديد-Foo+BAR
يولد UnifiedDiffOutputBuilder المستخدم في المثال أعلاه الإخراج بتنسيق "Diff الموحد" ويستخدمه phpunit ، على سبيل المثال.
يولد StrictUnifiedDiffOutputBuilder الناتج بتنسيق "Diff الصارم الموحد" مع الصخ ، على غرار diff -u ومتوافق مع patch أو git apply .
يولد DiffOnlyOutputBuilder الإخراج الذي يحتوي فقط على الخطوط التي تختلف.
إذا لم يتطابق أي من بناة الإخراج الثلاثة هذه ، فيمكنك تنفيذ DiffOutputBuilderInterface لإنشاء إخراج مخصص.
يمكن استخدام فئة Parser لتحليل فرق موحد في رسم بياني كائن:
استخدم Sebastianbergmanndiffparser ؛ استخدم Sebastianbergmanngit ؛ $ git = new git ('/usr/local/src/money') ؛ $ diff = $ git-> getDiff ('948A1A07768D8D8edd10dce8315cbeffb31833' ، '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() Return 0 ، فإن عدد الأسطر التي يتم إرجاعها بواسطة getStart() أو getEnd() أقل مما يتوقعه المرء. هذا هو رقم السطر الذي يجب أن يتم إدراجه أو حذفه ؛ في جميع الحالات الأخرى ، يعطي رقم السطر الأول من نطاق الخطوط المستبدلة.