Start · Sprachen · PHP · Referenz · uopz_add_function

uopz_add_function

Funktion

Fügt eine neue, bisher nicht existierende Funktion oder Methode zur Laufzeit hinzu.

Kategorie: misc

Signatur

uopz_add_function(string $class_or_function, string $function, Closure $handler, int $flags = ZEND_ACC_PUBLIC, bool $all = true): bool

Beschreibung

uopz_add_function ist Teil der UOPZ-Erweiterung (User Operations for Zend) und ermöglicht es, zur Laufzeit neue Funktionen oder Methoden zu einem Kontext hinzuzufügen, die dort vorher nicht existierten. Dies ist besonders nützlich im Bereich des Unit-Testings, wenn Abhängigkeiten gemockt oder Stubs für nicht vorhandene Funktionen erstellt werden müssen.

Wird nur ein Funktionsname und ein Closure-Handler übergeben, wird eine globale Funktion angelegt. Gibt man zusätzlich einen Klassennamen an, wird die Closure als Methode der angegebenen Klasse registriert. Mit dem Parameter $flags kann die Sichtbarkeit (ZEND_ACC_PUBLIC, ZEND_ACC_PROTECTED, ZEND_ACC_PRIVATE) oder weitere Attribute wie ZEND_ACC_STATIC gesteuert werden.

Der optionale Parameter $all bestimmt, ob die Funktion auch in allen abgeleiteten Klassen hinzugefügt werden soll. Standardmäßig ist dieser auf true gesetzt, sodass Unterklassen die neue Methode ebenfalls erhalten.

Hinweis: UOPZ ist primär für Test- und Debugging-Zwecke konzipiert und sollte nicht in produktiven Anwendungen eingesetzt werden. Die Erweiterung muss separat installiert und in der php.ini aktiviert sein.

Parameter

Name Typ Default Beschreibung
$class_or_function Pflicht string Der Name der Klasse, zu der eine Methode hinzugefügt werden soll, oder – wenn keine Klasse gemeint ist – der Name der neuen globalen Funktion. Im letzteren Fall entfällt der Parameter function.
$function string Der Name der neuen Methode innerhalb der durch class_or_function angegebenen Klasse. Wird nur benötigt, wenn eine Methode hinzugefügt wird.
$handler Pflicht Closure Eine Closure, die den Funktionskörper der neuen Funktion oder Methode definiert.
$flags int ZEND_ACC_PUBLIC Bitkombination von Sichtbarkeits- und Zugriffsflags, z. B. ZEND_ACC_PUBLIC, ZEND_ACC_PROTECTED, ZEND_ACC_PRIVATE oder ZEND_ACC_STATIC.
$all bool true Legt fest, ob die Methode auch allen Unterklassen der angegebenen Klasse hinzugefügt werden soll. Standard ist true.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Funktion oder Methode erfolgreich hinzugefügt wurde. Gibt false zurück, wenn die Funktion oder Methode bereits existiert oder ein anderer Fehler aufgetreten ist.

Beispiele

Neue globale Funktion zur Laufzeit hinzufügen

<?php
// Neue globale Funktion 'greet' hinzufügen
uopz_add_function('greet', function(string $name): string {
    return 'Hallo, ' . $name . '!';
});

echo greet('Welt');
Hallo, Welt!

Neue Methode zu einer bestehenden Klasse hinzufügen

<?php
class Fahrzeug {
    public string $marke;

    public function __construct(string $marke) {
        $this->marke = $marke;
    }
}

// Methode 'beschreibe' zur Klasse 'Fahrzeug' hinzufügen
uopz_add_function('Fahrzeug', 'beschreibe', function(): string {
    return 'Dies ist ein Fahrzeug der Marke ' . $this->marke;
}, ZEND_ACC_PUBLIC);

$auto = new Fahrzeug('BMW');
echo $auto->beschreibe();
Dies ist ein Fahrzeug der Marke BMW

Statische Methode zu einer Klasse hinzufügen

<?php
class MathHelper {}

uopz_add_function('MathHelper', 'quadrat', static function(int $n): int {
    return $n * $n;
}, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC);

echo MathHelper::quadrat(5);
25

// Wichtig · Fallstricke

Nur für Test- und Entwicklungszwecke: uopz_add_function sollte niemals in einer Produktionsumgebung verwendet werden, da es das Laufzeitverhalten von PHP tiefgreifend verändert und zu unvorhersehbarem Verhalten führen kann.

Die UOPZ-Erweiterung muss separat über PECL installiert werden: pecl install uopz. Zudem muss in der php.ini der Eintrag uopz.disable=0 gesetzt sein, da die Erweiterung standardmäßig deaktiviert sein kann.

Es ist nicht möglich, mit uopz_add_function eine Funktion oder Methode hinzuzufügen, die bereits existiert – in diesem Fall wird false zurückgegeben. Zum Überschreiben bestehender Funktionen sollte stattdessen uopz_set_return oder uopz_set_hook verwendet werden.