Start · Sprachen · PHP · Referenz · uopz_implement

uopz_implement

Funktion

Lässt eine bestehende Klasse zur Laufzeit ein Interface implementieren, ohne den Quellcode zu verändern.

seit PHP 5.0.0 Kategorie: misc

Signatur

uopz_implement(string $class, string $interface): bool

Beschreibung

uopz_implement gehört zur UOPZ-Erweiterung (User Operations for Zend) und ermöglicht es, einer bereits geladenen Klasse nachträglich ein Interface zuzuweisen. Dies geschieht vollständig zur Laufzeit, sodass keine Änderung am ursprünglichen Quellcode erforderlich ist.

Die Funktion ist primär für Unit-Tests und Mocking-Szenarien konzipiert. Sie erlaubt es, Klassen so zu manipulieren, dass sie bestimmten Interfaces genügen, ohne die eigentliche Implementierung anpassen zu müssen. Dies ist besonders nützlich, wenn Code mit Typprüfungen (instanceof) oder Type-Hints getestet werden soll.

Damit die Funktion erfolgreich ist, muss die Klasse alle abstrakten Methoden des Interfaces bereits implementieren (oder die Methoden müssen anderweitig durch UOPZ bereitgestellt werden). Andernfalls wird ein Fehler ausgelöst. Die Klasse und das Interface müssen zum Zeitpunkt des Aufrufs bereits im Speicher vorhanden sein.

Wichtiger Hinweis: UOPZ ist eine Entwicklungs- und Testwerkzeug-Erweiterung und sollte niemals in Produktionsumgebungen eingesetzt werden. Der Einsatz kann zu unvorhergesehenem Verhalten, Abstürzen und schwer nachvollziehbaren Fehlern führen.

Parameter

Name Typ Default Beschreibung
$class Pflicht string Der vollqualifizierte Name der Klasse, die das Interface implementieren soll. Die Klasse muss bereits geladen sein.
$interface Pflicht string Der vollqualifizierte Name des Interfaces, das der Klasse hinzugefügt werden soll. Das Interface muss ebenfalls bereits geladen sein.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn das Interface erfolgreich zur Klasse hinzugefügt wurde. Bei einem Fehler (z. B. unbekannte Klasse, unbekanntes Interface oder fehlende Methoden-Implementierungen) wird false zurückgegeben oder ein Fehler ausgelöst.

Beispiele

Klasse zur Laufzeit ein Interface implementieren lassen

<?php
interface Serializable
{
    public function serialize(): string;
    public function unserialize(string $data): void;
}

class MyData
{
    public function serialize(): string
    {
        return 'serialized';
    }

    public function unserialize(string $data): void
    {
        // Logik hier
    }
}

// Vor uopz_implement
var_dump(new MyData() instanceof Serializable); // bool(false)

// Interface zur Laufzeit hinzufügen
uopz_implement('MyData', 'Serializable');

// Nach uopz_implement
var_dump(new MyData() instanceof Serializable); // bool(true)
bool(false) bool(true)

Einsatz in einem PHPUnit-Test-Kontext

<?php
interface LoggerInterface
{
    public function log(string $message): void;
}

class SimpleLogger
{
    public function log(string $message): void
    {
        echo $message . PHP_EOL;
    }
}

function processWithLogger(LoggerInterface $logger): void
{
    $logger->log('Verarbeitung gestartet');
}

// SimpleLogger implementiert LoggerInterface noch nicht
// Im Test-Setup wird es nachträglich hinzugefügt:
uopz_implement('SimpleLogger', 'LoggerInterface');

$logger = new SimpleLogger();
processWithLogger($logger); // Funktioniert jetzt ohne TypeError
Verarbeitung gestartet

// Wichtig · Fallstricke

Nur für Test- und Entwicklungsumgebungen: Die UOPZ-Erweiterung greift tief in die Zend Engine ein. Der Einsatz in Produktionssystemen kann zu Instabilität, Speicherfehlern und nicht reproduzierbarem Verhalten führen.

Die Klasse muss alle Methoden des Interfaces bereits implementieren, da PHP sonst die Klasse als abstrakt behandeln müsste – was bei bestehenden, nicht-abstrakten Klassen zu einem fatalen Fehler führt.

Ab UOPZ Version 6 (für PHP 7+) kann das Verhalten leicht von älteren Versionen abweichen. Es empfiehlt sich, die Kompatibilität mit der eingesetzten PHP-Version zu prüfen.