Aikido

Warum man dynamische Variablennamen in PHP vermeiden sollte

Lesbarkeit

Regel
Vermeiden dynamisch Variable Namen
Dynamische Variablen Namen (Variablen Variablen) können führen
zu schwierigen zu zu Code und unerwartetes Verhalten. 
Ihre Verwendung ist in der Regel das Ergebnis eines einem Tippfehler.

Unterstützte Sprachen: PHP

Einleitung

Das Feature der variablen Variablen von PHP ermöglicht es Ihnen, den Wert einer Variablen als Namen einer anderen Variablen zu verwenden, mit dem $$ Syntax. Was wie eine clevere Abkürzung aussieht, wird zu einem Debugging-Albtraum, wenn man nicht statisch bestimmen kann, welche Variablen existieren oder was sie enthalten. Code, der $$userName anstatt einer Array- oder Objekteigenschaft macht es für IDEs unmöglich, Autovervollständigung bereitzustellen, für statische Analysatoren, Fehler zu erkennen, oder für Entwickelnde, den Datenfluss durch die Anwendung zu verfolgen.

Warum es wichtig ist

Code-Wartbarkeit: Variable Variablen unterbrechen jedes Tool, auf das Entwickelnde angewiesen sind. IDEs können Variablennamen nicht automatisch vervollständigen, Verwendungen finden oder sicher refaktorisieren. Statische Analysetools können undefinierte Variablen oder Typenkonflikte nicht erkennen. Debugging erfordert eine Laufzeitinspektion, da man die Codebasis nicht durchsuchen kann, um herauszufinden, wo Variablen gesetzt oder gelesen werden.

Sicherheitsimplikationen: Wenn Variablennamen aus Benutzereingaben stammen, können Angreifer beliebige Variablen überschreiben, einschließlich sicherheitskritischer. Ein bösartiger Anforderungsparameter könnte abzielen auf $$_GET['var'] zu überschreiben $isAdmin, $userId, oder Session-Variablen. Dies führt zu Variable-Injection-Schwachstellen, die schwer zu erkennen und leicht auszunutzen sind.

Leistungsauswirkungen: Variable Variablen zwingen PHP dazu, Laufzeit-Lookups anstelle von Kompilierungszeit-Symbolauflösungen durchzuführen. Der Interpreter muss den Variablennamen bei jedem Zugriff dynamisch auswerten, was Optimierungen verhindert, die mit normalen Variablen funktionieren. Arrays und Objekte bieten ähnliche Funktionalität mit besseren Leistungsmerkmalen.

Code-Beispiele

❌ Nicht konform:

function processFormData($formType) {
    $userForm = ['name' => '', 'email' => ''];
    $adminForm = ['name' => '', 'email' => '', 'role' => ''];

    $formName = $formType . 'Form';
    $$formName = array_merge($$formName, $_POST);

    if ($$formName['email']) {
        sendEmail($$formName['email']);
    }

    return $$formName;
}

// What variable does this actually use?
processFormData('user');

Warum es falsch ist: Der Code erstellt $userForm oder $adminForm dynamisch verwenden $$formName, wodurch es unmöglich wird nachzuvollziehen, welche Variable modifiziert wird. Wenn $formType aus Benutzereingaben stammt, könnten Angreifer beliebige Variablennamen einschleusen, um kritische Variablen zu überschreiben.

✅ Konform:

function processFormData(string $formType): array {
    $forms = [
        'user' => ['name' => '', 'email' => ''],
        'admin' => ['name' => '', 'email' => '', 'role' => '']
    ];

    if (!isset($forms[$formType])) {
        throw new InvalidArgumentException('Invalid form type');
    }

    $form = array_merge($forms[$formType], $_POST);

    if (!empty($form['email'])) {
        sendEmail($form['email']);
    }

    return $form;
}

// Clear which data structure is being used
processFormData('user');

Warum das wichtig ist: Der Code verwendet ein explizites Array mit bekannten Schlüsseln, was den Datenfluss offensichtlich macht und alle IDE-Funktionen ermöglicht. Eingabevalidierung verhindert Injection-Angriffe, und statische Analyse kann die Korrektheit des Codes überprüfen.

Fazit

Ersetzen Sie variable Variablen durch Arrays, Objekte oder eine bessere Code-Struktur. Verwenden Sie Arrays, wenn Sie dynamischen Schlüsselzugriff benötigen, Objekte für strukturierte Daten mit bekannten Eigenschaften und refaktorisieren Sie duplizierte Logik in geeignete Abstraktionen. Variable Variablen weisen fast immer auf ein Designproblem hin, das durch geeignete Datenstrukturen klarer gelöst werden könnte.

FAQs

Haben Sie Fragen?

Gibt es legitime Verwendungen für variable Variablen?

Extrem selten. Template-Engines und Metaprogrammierung-Frameworks verwenden sie manchmal, aber selbst diese Fälle werden besser durch Arrays oder dedizierte Datenstrukturen bedient. Wenn Sie glauben, variable Variablen zu benötigen, brauchen Sie wahrscheinlich ein Array mit dynamischen Schlüsseln oder ein Redesign Ihres Datenflusses.

Was ist mit extract(), das dynamisch Variablen erstellt?

extract() aus denselben Gründen wie variable Variablen vermeiden. Es erstellt dynamisch Variablen aus Array-Schlüsseln, was die statische Analyse beeinträchtigt und Sicherheitsrisiken schafft. Verwenden Sie direkten Array-Zugriff: $data['key'] anstelle von extract($data); $key. Moderner PHP-Code sollte extract() als Code-Smell betrachten.

Wie refaktorisere ich bestehenden Code, der variable Variablen verwendet?

Das implementierte Muster identifizieren. Meist handelt es sich um Konfigurationsdaten (Arrays verwenden), dynamische Eigenschaften (Objekte oder Arrays verwenden) oder bedingte Logik (geeignete Kontrollstrukturen verwenden). Ersetzen Sie $$varName in den meisten Fällen durch $config[$varName]. Verwenden Sie Objekte, wenn Sie Typsicherheit und IDE-Unterstützung für den Eigenschaftszugriff benötigen.

Was ist mit der Verwendung von variablen Variablen für Konstanten?

Immer noch problematisch. Verwenden Sie constant($name), wenn Sie Konstanten dynamisch zugreifen müssen, obwohl dies auch auf ein Designproblem hindeutet. Besserer Ansatz: Organisieren Sie verwandte Konstanten in einer Klasse und verwenden Sie ein Array oder einen Match-Ausdruck, um den geeigneten Wert basierend auf Laufzeitbedingungen auszuwählen.

Können variable Variablen Namespace-Kollisionen verursachen?

Ja, besonders bei Superglobals und Framework-Variablen. Code, der $$type = 'value' verwendet, könnte versehentlich $_GET, $_POST oder Framework-Variablen wie $this in unerwarteten Kontexten erzeugen. Arrays kapseln ihre Daten von Natur aus und verhindern diese Kollisionen von Grund auf.

Werden Sie jetzt sicher.

Sichern Sie Ihren Code, Ihre Cloud und Ihre Laufzeit in einem zentralen System.
Finden und beheben Sie Schwachstellen schnell und automatisch.

Keine Kreditkarte erforderlich | Scan-Ergebnisse in 32 Sek.