extract()
La funzione PHP extract() importa le chiavi di un array associativo come variabili nella tabella dei simboli. Sintassi, flag ed esempi.
Cos'è extract() in PHP?
extract() è una funzione PHP integrata che importa gli elementi di un array associativo nella tabella dei simboli corrente — trasformando ogni chiave in una variabile il cui valore è l'elemento corrispondente dell'array. È l'inverso di compact(), che costruisce un array a partire da variabili esistenti.
La sua firma è:
extract(array &$array, int $flags = EXTR_OVERWRITE, string $prefix = ""): int$array— l'array sorgente. Solo le chiavi string che sono nomi di variabili PHP validi diventano variabili. Le chiavi numeriche vengono ignorate a meno che non si usi un flag con prefisso.$flags— controlla come vengono gestite le collisioni di nome con le variabili esistenti (vedi Flag e comportamento).$prefix— una stringa anteposta ai nomi delle variabili quando viene usato un flag con prefisso.
Restituisce il numero di variabili importate con successo.
Come usare extract() in PHP
Inizia con un array associativo le cui chiavi sono i nomi delle variabili che vuoi ottenere:
$person = [
'name' => 'John Doe',
'age' => 30,
'email' => '[email protected]',
];
extract($person);
echo $name; // John Doe
echo $age; // 30
echo $email; // [email protected]Dopo extract($person), tre variabili — $name, $age e $email — esistono nello scope corrente, ognuna contenente il valore della chiave corrispondente.
Estrarre solo alcune chiavi
Per impostazione predefinita, extract() crea variabili per ogni chiave. Per importare un sottoinsieme, filtra prima l'array con array_intersect_key() e 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) trasforma ['name', 'email'] in ['name' => 0, 'email' => 1], e array_intersect_key() mantiene solo quelle chiavi da $person, così vengono estratti solo $name e $email.
Flag e comportamento
Il secondo parametro controlla come vengono gestite le variabili esistenti quando una chiave va in collisione con una variabile già esistente. I flag più comuni sono:
| Flag | Comportamento |
|---|---|
EXTR_OVERWRITE | Predefinito. Sovrascrive una variabile esistente con lo stesso nome. |
EXTR_SKIP | Lascia intatta una variabile esistente e salta quella chiave. |
EXTR_PREFIX_SAME | In caso di collisione, antepone $prefix alla nuova variabile. |
EXTR_PREFIX_ALL | Antepone $prefix a ogni variabile importata. |
EXTR_REFS | Importa le variabili come riferimenti agli elementi dell'array. |
Confronta EXTR_OVERWRITE (il predefinito) con 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 NameUsa EXTR_PREFIX_ALL per assegnare un namespace a ogni variabile ed evitare del tutto le collisioni:
$data = ['name' => 'John', 'age' => 30];
extract($data, EXTR_PREFIX_ALL, 'user');
echo $user_name; // John
echo $user_age; // 30Avviso di sicurezza
Poiché extract() crea variabili dinamicamente dalle chiavi, passargli dati non attendibili può sovrascrivere variabili esistenti — incluse quelle critiche o le superglobali come $_GET, $_POST e $_SESSION. Una vulnerabilità classica è extract($_GET), che permette a un attaccante di impostare qualsiasi variabile dello script tramite la query string:
$is_admin = false;
extract($_GET); // ?is_admin=1 now makes $is_admin truthy — dangerous!Non chiamare mai extract() direttamente sui dati di una richiesta. Se necessario, passa EXTR_SKIP in modo che le variabili esistenti non possano essere sovrascritte, oppure crea una whitelist delle chiavi con array_intersect_key() come mostrato sopra.
Quando usare extract()
extract() eccelle in situazioni ristrette e controllate:
- Rendering di template — un motore di view estrae un array di dati noti in variabili locali subito prima di includere un template, così il template può scrivere
$titleinvece di$data['title']. - Spacchettamento della configurazione — trasformare un piccolo array di configurazione attendibile in variabili con nome all'inizio di uno script.
Per la maggior parte del codice, l'assegnazione esplicita è più chiara e sicura di extract(), perché il lettore può vedere esattamente quali variabili entrano nello scope. Ricorrivi solo quando le chiavi sono attendibili e il guadagno in leggibilità è reale.
Riepilogo
extract() importa le chiavi di un array associativo come variabili nello scope corrente e restituisce quante ne ha create. Il comportamento predefinito EXTR_OVERWRITE lo rende potente ma rischioso: filtra sempre o usa EXTR_SKIP con input non attendibile. Per fare il contrario — costruire un array a partire da variabili — usa compact().