Signatur
Beschreibung
xdiff_file_merge3 führt einen sogenannten 3-Wege-Merge durch: Es nimmt eine gemeinsame Basisdatei (old_file) sowie zwei davon abgeleitete, unabhängig veränderte Versionen (new_file1, new_file2) und versucht, alle Änderungen beider neuen Versionen in die Zieldatei (dest) zu schreiben.
Diese Funktion ist besonders nützlich in Versionskontroll- und Kollaborationsszenarien, bei denen zwei Personen gleichzeitig dieselbe Ausgangsdatei bearbeitet haben und die Ergebnisse zusammengeführt werden müssen – ähnlich wie git merge oder das klassische Unix-Tool merge.
Treten Konflikte auf (d. h. beide neue Versionen haben dieselbe Stelle unterschiedlich verändert), werden diese im Merge-Ergebnis als Konfliktmarker eingebettet. Die Funktion gibt in diesem Fall true zurück und schreibt trotzdem eine Ausgabedatei, wobei die Konfliktstellen zur manuellen Auflösung markiert sind.
Die Funktion ist Teil der xdiff-Erweiterung, die auf der libxdiff-Bibliothek basiert. Für das Arbeiten mit Strings statt Dateipfaden steht xdiff_string_merge3 zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $old_file Pflicht | string | Pfad zur gemeinsamen Basisdatei (der ursprüngliche, unveränderte Stand), von der beide neuen Dateien abgeleitet wurden. | |
| $new_file1 Pflicht | string | Pfad zur ersten geänderten Version der Basisdatei (z. B. Änderungen von Person A). | |
| $new_file2 Pflicht | string | Pfad zur zweiten geänderten Version der Basisdatei (z. B. Änderungen von Person B). | |
| $dest Pflicht | string | Pfad zur Zieldatei, in die das Merge-Ergebnis geschrieben wird. Existiert die Datei bereits, wird sie überschrieben. |
Rückgabewert
Gibt true zurück, wenn der Merge erfolgreich war (auch dann, wenn Konflikte aufgetreten sind – diese werden als Konfliktmarker in dest eingebettet). Gibt false zurück, wenn ein Fehler aufgetreten ist, z. B. wenn eine der Eingabedateien nicht geöffnet werden konnte oder die Zieldatei nicht beschreibbar ist. Im Konfliktfall enthält die Ausgabedatei Markierungen wie <<<<<<< und >>>>>>>.
Beispiele
Einfacher 3-Wege-Merge zweier Textdateien
<?php
// Basisdatei (ursprünglicher Stand)
file_put_contents('/tmp/base.txt', "Zeile 1\nZeile 2\nZeile 3\n");
// Änderung von Person A: Zeile 2 geändert
file_put_contents('/tmp/version_a.txt', "Zeile 1\nZeile 2 - Änderung A\nZeile 3\n");
// Änderung von Person B: Zeile 3 geändert
file_put_contents('/tmp/version_b.txt', "Zeile 1\nZeile 2\nZeile 3 - Änderung B\n");
$result = xdiff_file_merge3(
'/tmp/base.txt',
'/tmp/version_a.txt',
'/tmp/version_b.txt',
'/tmp/merged.txt'
);
if ($result === true) {
echo "Merge erfolgreich (möglicherweise mit Konflikten).\n";
echo file_get_contents('/tmp/merged.txt');
} else {
echo "Merge fehlgeschlagen.\n";
}
Konflikt-Erkennung beim Merge
<?php
// Basisdatei
file_put_contents('/tmp/base.txt', "Zeile 1\nZeile 2\nZeile 3\n");
// Beide Versionen ändern dieselbe Zeile unterschiedlich → Konflikt
file_put_contents('/tmp/version_a.txt', "Zeile 1\nZeile 2 - Änderung A\nZeile 3\n");
file_put_contents('/tmp/version_b.txt', "Zeile 1\nZeile 2 - Änderung B\nZeile 3\n");
$result = xdiff_file_merge3(
'/tmp/base.txt',
'/tmp/version_a.txt',
'/tmp/version_b.txt',
'/tmp/merged_conflict.txt'
);
$content = file_get_contents('/tmp/merged_conflict.txt');
// Prüfen ob Konfliktmarker vorhanden
if (strpos($content, '<<<<<<<') !== false) {
echo "Achtung: Merge-Konflikte gefunden – manuelle Auflösung erforderlich!\n";
} else {
echo "Kein Konflikt – Merge vollständig automatisch.\n";
}
echo $content;
// Wichtig · Fallstricke
Voraussetzung: Die xdiff-Erweiterung muss installiert und aktiviert sein (pecl install xdiff). Sie ist nicht Teil der PHP-Standarddistribution.
Konfliktmarker: Wenn beide neuen Dateien dieselbe Stelle der Basisdatei unterschiedlich verändern, werden Konflikte mit Markierungen wie <<<<<<<, ======= und >>>>>>> in die Ausgabedatei geschrieben – ähnlich wie bei git merge. Die Funktion gibt trotzdem true zurück, sodass Konflikte explizit geprüft werden müssen (z. B. per strpos auf die Marker).
Dateizugriff: Alle übergebenen Pfade müssen vom aktuellen PHP-Prozess lesbar (Eingabedateien) bzw. schreibbar (Zieldatei) sein. Fehlerhafte Pfade führen zu einem Rückgabewert von false.
Für In-Memory-Operationen ohne Dateizugriff kann alternativ xdiff_string_merge3 verwendet werden.