extract()
PHP extract() importiert die Schlüssel eines assoziativen Arrays als Variablen in die aktuelle Symboltabelle. Lernen Sie Syntax, Flags, Sicherheitsrisiken und Beispiele.
Was ist extract() in PHP?
extract() ist eine in PHP eingebaute Funktion, die die Elemente eines assoziativen Arrays in die aktuelle Symboltabelle importiert — dabei wird jeder Schlüssel zu einer Variable, deren Wert dem passenden Array-Element entspricht. Sie ist das Gegenstück zu compact(), das aus vorhandenen Variablen ein array erstellt.
Ihre Signatur lautet:
extract(array &$array, int $flags = EXTR_OVERWRITE, string $prefix = ""): int$array— das Quell-array. Nur string-Schlüssel, die gültige PHP-Variablennamen sind, werden zu Variablen. Numerische Schlüssel werden übersprungen, sofern kein Präfix-Flag verwendet wird.$flags— steuert, wie Namenskollisionen mit vorhandenen Variablen behandelt werden (siehe Flags und Verhalten).$prefix— ein string, der den Variablennamen vorangestellt wird, wenn ein Präfix-Flag verwendet wird.
Die Funktion gibt die Anzahl der erfolgreich importierten Variablen zurück.
Wie verwendet man extract() in PHP?
Beginnen Sie mit einem assoziativen array, dessen Schlüssel die gewünschten Variablennamen sind:
$person = [
'name' => 'John Doe',
'age' => 30,
'email' => '[email protected]',
];
extract($person);
echo $name; // John Doe
echo $age; // 30
echo $email; // [email protected]Nach extract($person) existieren im aktuellen Scope drei Variablen — $name, $age und $email — von denen jede den Wert des zugehörigen Schlüssels enthält.
Nur bestimmte Schlüssel extrahieren
Standardmäßig erstellt extract() Variablen für jeden Schlüssel. Um nur eine Teilmenge zu importieren, filtern Sie das array zunächst mit array_intersect_key() und array_flip():
$wanted = ['name', 'email'];
$count = extract(array_intersect_key($person, array_flip($wanted)));
echo $count; // 2
echo $name; // John Doe
echo $email; // [email protected]
// $age is NOT createdarray_flip($wanted) wandelt ['name', 'email'] in ['name' => 0, 'email' => 1] um, und array_intersect_key() behält nur diese Schlüssel aus $person, sodass nur $name und $email extrahiert werden.
Flags und Verhalten
Der zweite Parameter steuert, wie mit vorhandenen Variablen umgegangen wird, wenn ein Schlüssel mit einer bereits existierenden Variable kollidiert. Die gängigsten Flags sind:
| Flag | Verhalten |
|---|---|
EXTR_OVERWRITE | Standard. Überschreibt eine vorhandene Variable gleichen Namens. |
EXTR_SKIP | Lässt eine vorhandene Variable unverändert und überspringt diesen Schlüssel. |
EXTR_PREFIX_SAME | Stellt bei einer Kollision der neuen Variable $prefix voran. |
EXTR_PREFIX_ALL | Stellt jeder importierten Variable $prefix voran. |
EXTR_REFS | Importiert Variablen als Referenzen auf die Array-Elemente. |
Vergleichen Sie EXTR_OVERWRITE (den Standard) mit EXTR_SKIP:
$name = 'Existing Name';
$data = ['name' => 'New Name'];
extract($data); // default: overwrites
echo $name; // New Name
$name = 'Existing Name';
extract($data, EXTR_SKIP); // keep what's already set
echo $name; // Existing NameVerwenden Sie EXTR_PREFIX_ALL, um jeder Variable einen eigenen Namensraum zu geben und Kollisionen vollständig zu vermeiden:
$data = ['name' => 'John', 'age' => 30];
extract($data, EXTR_PREFIX_ALL, 'user');
echo $user_name; // John
echo $user_age; // 30Sicherheitswarnung
Da extract() Variablen dynamisch aus Schlüsseln erzeugt, kann die Übergabe nicht vertrauenswürdiger Daten vorhandene Variablen überschreiben — einschließlich kritischer Variablen oder Superglobals wie $_GET, $_POST und $_SESSION. Eine klassische Schwachstelle ist extract($_GET), wodurch ein Angreifer über die Query-String beliebige Variablen in Ihrem Skript setzen kann:
$is_admin = false;
extract($_GET); // ?is_admin=1 now makes $is_admin truthy — dangerous!Rufen Sie extract() niemals direkt auf Request-Daten auf. Falls unvermeidbar, übergeben Sie EXTR_SKIP, damit vorhandene Variablen nicht überschrieben werden können, oder erlauben Sie nur bestimmte Schlüssel per Whitelist mit array_intersect_key(), wie oben gezeigt.
Wann sollte man extract() verwenden?
extract() zeigt seine Stärken in eng begrenzten, kontrollierten Situationen:
- Template-Rendering — eine View-Engine extrahiert ein bekanntes Daten-array in lokale Variablen, kurz bevor ein Template eingebunden wird, sodass das Template
$titlestatt$data['title']schreiben kann. - Konfigurations-Entpacken — ein kleines, vertrauenswürdiges Konfigurations-array am Anfang eines Skripts in benannte Variablen umwandeln.
Für die meisten Codebasen ist eine explizite Zuweisung klarer und sicherer als extract(), da ein Leser genau erkennen kann, welche Variablen in den Scope gelangen. Greifen Sie nur dann darauf zurück, wenn die Schlüssel vertrauenswürdig sind und der Lesbarkeitsgewinn real ist.
Zusammenfassung
extract() importiert die Schlüssel eines assoziativen Arrays als Variablen in den aktuellen Scope und gibt zurück, wie viele davon erstellt wurden. Das Standardverhalten EXTR_OVERWRITE macht die Funktion mächtig, aber riskant: Filtern Sie stets oder verwenden Sie EXTR_SKIP bei nicht vertrauenswürdiger Eingabe. Um den umgekehrten Weg zu gehen — aus Variablen ein array zu erstellen — verwenden Sie compact().