Implementasi diff untuk PHP, diperhitungkan dari PHPunit menjadi komponen yang berdiri sendiri.
Anda dapat menambahkan perpustakaan ini sebagai ketergantungan lokal, per proyek ke proyek Anda menggunakan komposer:
composer require sebastian/diff
Jika Anda hanya membutuhkan perpustakaan ini selama pengembangan, misalnya untuk menjalankan suite tes proyek Anda, maka Anda harus menambahkannya sebagai ketergantungan waktu pengembangan:
composer require --dev sebastian/diff
Kelas Differ
dapat digunakan untuk menghasilkan representasi tekstual dari perbedaan antara dua string:
<? PHP Declare (strict_types = 1); Gunakan Sebastianbergmanndiffdiffer; gunakan SebastianbergmanndiffoutputUnifiedDiffoutputBuilder; $ berbeda = berbeda baru (baru UnifiedDiffoutputBuilder); cetak $ berbeda-> diff ('foo', 'bar');
Kode di atas menghasilkan output di bawah ini:
--- asli +++ baru @@ @@-foo+bar
UnifiedDiffOutputBuilder
yang digunakan dalam contoh di atas menghasilkan output dalam format "Diff Unified" dan digunakan oleh phPunit, misalnya.
StrictUnifiedDiffOutputBuilder
menghasilkan output dalam format "Diff Unified Diff" dengan Hunks, mirip dengan diff -u
dan kompatibel dengan patch
atau git apply
.
DiffOnlyOutputBuilder
menghasilkan output yang hanya berisi garis yang berbeda.
Jika tidak satu pun dari tiga pembangun output ini cocok dengan kasing Anda maka Anda dapat mengimplementasikan DiffOutputBuilderInterface
untuk menghasilkan output khusus.
Kelas Parser
dapat digunakan untuk menguraikan diff terpadu ke dalam grafik objek:
Gunakan Sebastianbergmanndiffparser; gunakan SebastianBerbmanngit; $ git = baru git ('/usr/local/src/money'); $ diff = $ git-> getdiff ('948A1A07768D8EDD10DCEFA8315C1CBEFFB3183D8D10 'C07A373D2399F3E686234C4F7F088D635EB9641B'); $ parser = parser baru; print_r ($ parser-> parse ($ diff));
Kode di atas menghasilkan output di bawah ini:
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')); ) ) ) ) ) )
Catatan: Jika ukuran chunk adalah 0 baris, yaitu, getStartRange()
atau getEndRange()
return 0, jumlah baris yang dikembalikan oleh getStart()
atau getEnd()
adalah yang lebih rendah dari yang diharapkan. Ini adalah nomor baris setelah itu potongan harus dimasukkan atau dihapus; Dalam semua kasus lain, ini memberikan nomor baris pertama dari rentang garis yang diganti.