Start · Sprachen · PHP · Referenz · runkit7_import

runkit7_import

Funktion

Importiert Funktions- und Klassendefinitionen aus einer PHP-Datei und kann dabei bestehende Definitionen überschreiben.

Kategorie: misc

Signatur

runkit7_import(string $filename, int $flags = RUNKIT7_IMPORT_FUNCTIONS | RUNKIT7_IMPORT_CLASSES): bool

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:

  • RUNKIT7_IMPORT_FUNCTIONS – Importiert Funktionsdefinitionen.
  • RUNKIT7_IMPORT_CLASSES – Importiert Klassendefinitionen.
  • RUNKIT7_IMPORT_METHODS – Importiert Methoden in bestehende Klassen.
  • RUNKIT7_IMPORT_OVERRIDE – Erlaubt das Überschreiben bereits definierter Funktionen/Klassen/Methoden.

Rückgabewert

Typ
bool
Beschreibung
Gibt 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;
}
Hallo, Welt! (v1) Hallo, Welt! (v2)

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;
}
[MOCK] E-Mail an test@example.com: Testinhalt

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