Signatur
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
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)
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
// 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.