Search by

Git-compatible line diff for PHP: a port of Git's xdiff Myers pipeline with the indent heuristic and a unified diff renderer.

Package info

github.com/php-forge/diff

pkg:composer/php-forge/diff

Statistics

Installs: 1

Dependents: 0

Suggesters: 0

Stars: 1

Open Issues: 0

0.1.0 2026-10-27 10:07 UTC

This package is auto-updated.

Last update: 2026-10-27 10:23:39 UTC


README

PHP Forge

Diff


Testo Mutation Testing PHPStan Security

Git-compatible line diff for PHP
A port of Git's default diff, indent heuristic included, plus a unified diff renderer, with no runtime dependencies.

Features

Feature Overview

Installation

composer require php-forge/diff:^0.1

Quick start

LineDiffer implements PHPForge\Diff\DifferInterface. diff() splits both strings on "\n" and returns an ordered list of DiffLine objects, each tagged with a DiffOp:

  • DiffOp::Remove: the line exists only in $old.
  • DiffOp::Add: the line exists only in $new.
  • DiffOp::Context: the line exists on both sides.

Every input line appears exactly once, so dropping the Add lines reconstructs $old and dropping the Remove lines reconstructs $new.

use PHPForge\Diff\{DiffOp, LineDiffer};

$old = "apple\nbanana\ncherry";
$new = "apple\nblueberry\ncherry";

foreach ((new LineDiffer())->diff($old, $new) as $line) {
    echo match ($line->op) {
        DiffOp::Context => ' ',
        DiffOp::Remove => '-',
        DiffOp::Add => '+',
    } . $line->line . "\n";
}
 apple
-banana
+blueberry
 cherry

UnifiedDiffRenderer turns two texts into a unified diff in Git's format, hunk headers and function context included, without the diff --git and index lines.

use PHPForge\Diff\UnifiedDiffRenderer;

$old = "apple\nbanana\ncherry\n";
$new = "apple\nblueberry\ncherry\n";

echo (new UnifiedDiffRenderer())->render($old, $new, 'a/fruit.txt', 'b/fruit.txt');
--- a/fruit.txt
+++ b/fruit.txt
@@ -1,3 +1,3 @@
 apple
-banana
+blueberry
 cherry

What you get

Class Result Cost
LineDiffer The edit script of git diff with its default settings O((N + M) ยท D) time, linear memory
UnifiedDiffRenderer The text of git diff --unified=<n> from the --- line on The injected differ plus one pass over edits

N and M are the line counts of $old and $new, and D is the edit distance. Like Git, LineDiffer favours readable scripts over the shortest one, so its edit count is not always minimal. Unlike Git, it has no cost limit, so on very expensive inputs its script can differ from Git's. See the algorithms guide for the pipeline and its trade-offs.

Documentation

AI assistance

AI agents: read the documentation index and fetch the Markdown version of a page by appending index.md to its URL. The AI agents guide covers skill installation, client setup and verification.

If hosted documentation does not match the installed revision or is unavailable, use the repository guides, the skill source, the source PHPDoc and the changelog.

Package information

PHP Latest Stable Version Total Downloads

Project status

Codecov PHPStan Level Max Quality

Built with AI

Built with Claude Code Built with Codex Reviewed by CodeRabbit

Our social networks

Follow on X Follow on Facebook

License

License