Signatur
Beschreibung
runkit7_import() liest eine PHP-Quelldatei ein und importiert daraus Funktions- und/oder Klassendefinitionen in den aktuellen PHP-Laufzeitkontext. Im Gegensatz zu einem gewöhnlichen include oder require führt die Funktion den Code der Datei nicht direkt aus, sondern extrahiert gezielt die enthaltenen Definitionen.
Über den Parameter $flags lässt sich steuern, was importiert wird (Funktionen, Klassen oder beides) und ob bereits vorhandene Definitionen überschrieben werden dürfen. Die relevanten Konstanten sind RUNKIT7_IMPORT_FUNCTIONS, RUNKIT7_IMPORT_CLASSES, RUNKIT7_IMPORT_METHODS sowie RUNKIT7_IMPORT_OVERRIDE, die per bitweisem ODER kombiniert werden können.
Der häufigste Anwendungsfall ist das dynamische Nachladen oder Austauschen von Implementierungen zur Laufzeit – zum Beispiel beim Testen (Hot-Swap von Mocks), beim Patchen von Klassen ohne Neustart des Prozesses oder beim Laden von Plugin-Dateien, die vorhandene Logik erweitern sollen. Das erfordert die runkit7-Extension.
Wichtig: Die Funktion steht nur zur Verfügung, wenn die PECL-Extension runkit7 installiert und geladen ist. Sie sollte ausschließlich in kontrollierten Umgebungen (CLI, Testing, Development) eingesetzt werden, da das nachträgliche Überschreiben von Definitionen zur Laufzeit zu schwer nachvollziehbaren Fehlern führen kann.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $filename Pflicht | string | Pfad zur PHP-Datei, aus der Definitionen importiert werden sollen. Die Datei wird geparst, aber ihr Code (außerhalb von Funktions-/Klassendefinitionen) wird nicht ausgeführt. | |
| $flags | int | RUNKIT7_IMPORT_FUNCTIONS | RUNKIT7_IMPORT_CLASSES | Bitmaske, die steuert, was importiert und wie mit Konflikten umgegangen wird. Mögliche Werte:
|
Rückgabewert
true zurück, wenn der Import erfolgreich war, andernfalls false (z. B. wenn die Datei nicht lesbar ist oder ein Namenskonflikt ohne RUNKIT7_IMPORT_OVERRIDE auftritt).Beispiele
Grundlegender Import von Funktionen aus einer externen Datei
<?php
// helpers_v2.php:
// function greet(string $name): string {
// return "Hallo, $name! (v2)";
// }
// Bereits definierte Funktion (Platzhalter):
function greet(string $name): string {
return "Hallo, $name! (v1)";
}
echo greet('Welt') . PHP_EOL; // Hallo, Welt! (v1)
// Funktion aus Datei importieren und vorhandene überschreiben:
$result = runkit7_import(
'helpers_v2.php',
RUNKIT7_IMPORT_FUNCTIONS | RUNKIT7_IMPORT_OVERRIDE
);
if ($result) {
echo greet('Welt') . PHP_EOL; // Hallo, Welt! (v2)
} else {
echo 'Import fehlgeschlagen.' . PHP_EOL;
}
Klassen-Hot-Swap für Unit-Tests
<?php
// mock_classes.php:
// class Mailer {
// public function send(string $to, string $msg): bool {
// // Keine echte E-Mail – Stub für Tests
// echo "[MOCK] E-Mail an $to: $msg\n";
// return true;
// }
// }
// Vorhandene Produktivklasse durch Mock ersetzen:
$imported = runkit7_import(
'mock_classes.php',
RUNKIT7_IMPORT_CLASSES | RUNKIT7_IMPORT_OVERRIDE
);
if ($imported) {
$mailer = new Mailer();
$mailer->send('test@example.com', 'Testinhalt');
} else {
echo 'Mock-Import fehlgeschlagen.' . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweis: runkit7_import() sollte niemals mit benutzerkontrollierten Dateinamen verwendet werden, da dies zur Ausführung beliebiger PHP-Definitionen führen kann. Den Dateinamen immer fest im Code hinterlegen oder zumindest gegen eine Whitelist prüfen.
Stabilitätshinweis: Das Überschreiben von Klassen zur Laufzeit (RUNKIT7_IMPORT_OVERRIDE in Kombination mit RUNKIT7_IMPORT_CLASSES) kann bei bereits instanziierten Objekten oder bei Vererbungshierarchien zu unvorhersehbarem Verhalten führen. Diese Technik sollte auf isolierte Test-Umgebungen beschränkt bleiben.
Die Funktion setzt die installierte und aktivierte PECL-Extension runkit7 voraus. Auf Produktionssystemen ist die Extension – und damit auch diese Funktion – in der Regel nicht und sollte nicht verfügbar sein.