Start · Sprachen · PHP · Referenz · runkit7_function_add

runkit7_function_add

Funktion

Fügt zur Laufzeit eine neue benutzerdefinierte Funktion in den PHP-Symbolraum ein, ähnlich wie das veraltete <code>create_function()</code>.

Kategorie: misc

Signatur

runkit7_function_add(string $function_name, string $argument_list, string $code, bool $return_by_ref = false, string $doc_comment = null, string $return_type = null): bool

Beschreibung

runkit7_function_add() ist Teil der Runkit7-Erweiterung und ermöglicht es, während der Skript-Ausführung dynamisch neue Funktionen zu definieren. Im Gegensatz zu create_function() (das intern anonyme Lambda-Funktionen erzeugt und seit PHP 7.2 als veraltet gilt) registriert runkit7_function_add() die neue Funktion unter dem angegebenen Namen direkt in der globalen Funktionsliste.

Typische Einsatzszenarien sind Plugin-Systeme, Testrahmen (z. B. Monkey-Patching von globalen Funktionen in Unit-Tests) und Laufzeit-Code-Generierung, bei der der Funktionsname erst zur Ausführungszeit bekannt ist. Die Funktion bietet dabei mehr Kontrolle als eval(), da der Code sauber als benannte Funktion registriert wird.

Der Parameter $argument_list entspricht der Parameterliste, wie sie in einem normalen function-Header stünde (z. B. $a, $b = 0). Der Parameter $code enthält den Funktionsrumpf ohne umschließende geschweifte Klammern. Optional kann ein PHPDoc-Kommentar und ein Rückgabetyp angegeben werden.

Wichtig: Runkit7 ist eine PECL-Erweiterung und muss explizit installiert und in der php.ini aktiviert werden. Sie ist nicht Bestandteil der PHP-Standarddistribution. In Produktionsumgebungen sollte ihr Einsatz sorgfältig abgewogen werden, da dynamisch erzeugter Code schwer zu debuggen und zu warten ist.

Parameter

Name Typ Default Beschreibung
$function_name Pflicht string Der Name, unter dem die neue Funktion im globalen Funktionsraum registriert werden soll. Darf noch nicht existieren, sonst schlägt der Aufruf fehl.
$argument_list Pflicht string Die Parameterliste der neuen Funktion als Zeichenkette, analog zur Parameterliste in einem function-Header, z. B. '$a, $b = 0'. Leer lassen für parameterlose Funktionen.
$code Pflicht string Der Quellcode des Funktionsrumpfs als Zeichenkette, ohne umschließende geschweifte Klammern. Wird intern wie eval() ausgewertet.
$return_by_ref bool false Gibt an, ob die neue Funktion ihren Rückgabewert als Referenz liefern soll (entspricht dem &-Prefix bei normalen Funktionsdeklarationen).
$doc_comment string null Ein optionaler PHPDoc-Kommentarblock, der der Funktion zugeordnet wird und über die Reflection-API ausgelesen werden kann.
$return_type string null Optionaler Rückgabetyp der Funktion als Zeichenkette, z. B. 'int' oder 'string'. Entspricht dem Typhinweis nach dem : in modernen Funktionsdeklarationen.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Funktion erfolgreich hinzugefügt wurde, andernfalls false — etwa wenn eine Funktion mit demselben Namen bereits existiert oder der Code einen Syntaxfehler enthält.

Beispiele

Einfache Funktion zur Laufzeit registrieren

<?php
// Runkit7-Erweiterung muss geladen sein
if (!extension_loaded('runkit7')) {
    die('runkit7 nicht geladen');
}

// Neue Funktion 'berechne_summe' dynamisch hinzufügen
$success = runkit7_function_add(
    'berechne_summe',
    '$a, $b',
    'return $a + $b;'
);

if ($success) {
    echo berechne_summe(3, 7); // Gibt 10 aus
} else {
    echo 'Funktion konnte nicht hinzugefügt werden.';
}
10

Funktion mit Rückgabetyp und PHPDoc hinzufügen

<?php
// Neue Funktion mit Typhinweis und Dokumentation registrieren
runkit7_function_add(
    'begruessung',
    'string $name',
    'return "Hallo, " . htmlspecialchars($name) . "!";',
    false,
    '/** Gibt eine Begrüßungsnachricht zurück. */',
    'string'
);

echo begruessung('Welt');

// Reflection prüfen
$rf = new ReflectionFunction('begruessung');
echo PHP_EOL . $rf->getDocComment();
Hallo, Welt! /** Gibt eine Begrüßungsnachricht zurück. */

// Wichtig · Fallstricke

Sicherheitshinweis: Da $code intern wie eval() behandelt wird, dürfen dort niemals ungeprüfte Benutzereingaben einfließen. Andernfalls droht beliebige Remote-Code-Execution (RCE).

Existierende Funktionen: Versucht man, eine bereits definierte Funktion erneut hinzuzufügen, gibt die Funktion false zurück. Um eine bestehende Funktion zu ersetzen, sollte stattdessen runkit7_function_redefine() verwendet werden.

Umgebung: Runkit7 ist primär für Entwicklungs- und Testumgebungen konzipiert. In Produktionssystemen ist der Einsatz in der Regel nicht empfehlenswert, da er die Vorhersehbarkeit des Codes stark einschränkt und Debugging erschwert. Die Erweiterung erfordert außerdem die INI-Option runkit.internal_override, wenn interne PHP-Funktionen beeinflusst werden sollen.