Seiteneffekte vermeiden

Da wir annehmen, dass in calculator.php in Wirklichkeit ganz viele komplizierte Dinge passieren, wollen wir diese Datei überhaupt nicht anfassen. Das Risiko, dabei einen Fehler zu machen, ist einfach viel zu groß.

Glücklicherweise hat PHP einen Output Buffer. Sobald man ihn einschaltet, fängt er alle Ausgaben ab, die gemacht werden. Man kann dann entweder den Output Buffer direkt ausgeben oder seinen Inhalt in einen String zuweisen. Genau das wollen wir machen:

<?php declare(strict_types=1);

namespace spriebsch\tfd\softwareModernisation\branchByAbstraction\encapsulateLegacyPages\sideEffects;

$a = 1;
$b = 2;

print Library::add($a, $b);

class Library
{
    public static function add(int $a, int $b): int
    {
        ob_start();
        require __DIR__ . '/calculator.php';
        $result = ob_get_clean();

        return (int) $result;
    }
}
example.php

Nun können wir auch das Ergebnis - in unserem Beispiel ein int, in der Realität wohl eher ein String aus der Methode zurückgeben. Daher der Return Type int.

Funktioniert das immer noch?

3
Ausgabe von example.php
example.php ausführen

Wunderbar. Wir haben eine Abstraktion geschaffen, nämlich die Methode add(). Diese benutz hinter den Kulissen noch immer das völlig unveränderte calculator.php.

Jetzt wäre der richtige Zeitpunkt, alle Stellen im Code, die calculator.php benutzen, nach und nach auf Library::add() umzustellen. Das Gute daran ist, dass wir jederzeit lauffähig bleiben und uns für die Umstellung Schritt für Schritt etwas Zeit lassen können.

Wenn wir alle Aufrufer umgestellt haben, dann ist add() der einzige Ort in unserer Anwendung, an dem require __DIR__ . '/calculator.php'; steht. Das require ist somit zu einem Implementierungsdetail unserer Abstraktion geworden.

Und diese Implementierung können wir nach Lust und Laune austauschen.