Start · Sprachen · PHP · Referenz · uopz_extend

uopz_extend

Funktion

Lässt eine bestehende Klasse zur Laufzeit von einer anderen Klasse erben, ohne den Quellcode zu ändern.

seit PHP 5.0.0 Kategorie: misc

Signatur

uopz_extend(string $class, string $parent): bool

Beschreibung

uopz_extend ist Teil der UOPZ-Erweiterung (User Operations for Zend) und ermöglicht es, die Vererbungshierarchie einer bereits definierten Klasse zur Laufzeit zu verändern. Damit kann eine Klasse nachträglich eine andere als Elternklasse erhalten, als wäre sie mit class Foo extends Bar deklariert worden.

Diese Funktion ist primär für Unit-Tests und Mocking-Szenarien gedacht, in denen man das Verhalten von Klassen manipulieren möchte, ohne den eigentlichen Produktionscode anzufassen. Sie ist besonders nützlich, wenn Legacy-Code ohne Dependency-Injection-Mechanismen getestet werden soll.

Es ist zu beachten, dass diese Funktion ausschließlich in Verbindung mit der UOPZ-PHP-Extension funktioniert, die typischerweise nur in Entwicklungs- und Testumgebungen installiert ist. In Produktionsumgebungen sollte sie nicht verwendet werden, da sie tief in die Zend Engine eingreift und unvorhergesehene Seiteneffekte erzeugen kann.

Die Änderung wirkt sich auf die gesamte Laufzeit des aktuellen PHP-Prozesses aus. Ein erneuter Aufruf mit einer anderen Elternklasse überschreibt die vorherige Zuweisung.

Parameter

Name Typ Default Beschreibung
$class Pflicht string Der vollqualifizierte Name der Klasse, deren Elternklasse geändert werden soll.
$parent Pflicht string Der vollqualifizierte Name der Klasse, die als neue Elternklasse gesetzt werden soll. Diese Klasse muss bereits definiert sein.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Elternklasse erfolgreich gesetzt wurde, andernfalls false (z. B. wenn eine der angegebenen Klassen nicht existiert oder die Operation nicht möglich ist).

Beispiele

Klasse zur Laufzeit erweitern

<?php
class Animal {
    public function speak(): string {
        return 'Some generic sound';
    }
}

class Dog {
    // Noch keine Elternklasse
}

// Dog erbt nun zur Laufzeit von Animal
uopz_extend(Dog::class, Animal::class);

$dog = new Dog();
echo $dog->speak(); // Methode von Animal wird geerbt
Some generic sound

Elternklasse in Testumgebung austauschen

<?php
class RealRepository {
    public function find(int $id): array {
        // Würde normalerweise eine DB-Abfrage machen
        return ['id' => $id, 'name' => 'Real Data'];
    }
}

class MockRepository {
    public function find(int $id): array {
        return ['id' => $id, 'name' => 'Mock Data'];
    }
}

class UserService extends RealRepository {
    // Erbt ursprünglich von RealRepository
}

// Zur Laufzeit auf Mock-Implementierung umschalten
uopz_extend(UserService::class, MockRepository::class);

$service = new UserService();
var_dump($service->find(42));
array(2) { ["id"]=> int(42) ["name"]=> string(9) "Mock Data" }

// Wichtig · Fallstricke

Achtung: uopz_extend greift direkt in interne Zend-Engine-Strukturen ein. Der Einsatz in Produktionsumgebungen ist ausdrücklich nicht empfohlen, da es zu unvorhersehbarem Verhalten, Speicherproblemen oder Abstürzen kommen kann.

Die UOPZ-Erweiterung muss explizit installiert und in der php.ini aktiviert sein (extension=uopz). Sie ist nicht Teil der Standard-PHP-Distribution.

Bei der Verwendung von uopz_extend können Konflikte auftreten, wenn die Zielklasse bereits Eigenschaften oder Methoden definiert, die mit der neuen Elternklasse inkompatibel sind (z. B. unterschiedliche Methodensignaturen). PHP kann in solchen Fällen einen fatalen Fehler werfen.

Ab UOPZ 6.x kann das Verhalten dieser Funktion je nach PHP-Version leicht abweichen. Es empfiehlt sich, die offizielle UOPZ-Dokumentation für die verwendete PHP-Version zu konsultieren.